📚 Study/Oracle
Oracle :: PL/SQL
bono-hye
2023. 11. 5. 22:20
(파일명 20231102_02_scott(plsql))
■ PL/SQL(Procedural Language extension to SQL)
- 프로그래밍 언어의 특성을 가지는 SQL 의 확정이며, 데이터 조작과 질의 문장은 PL/SQL의 절차적 코드 안에 포함된다.
- PL/SQL 을 사용하면 SQL 로 할 수 없는 절차적 작업이 가능!!
- 여기에서 절착적이란 의미는 어떤 것이 어떤 과정을 거쳐 어떻게 완료되는지 그 방법을 정확하게 코드에 기술한다는 것!
- PL/SQL 은 절차적으로 표현하기 위해 변수를 선언할 수 있는 기능, 참과 거짓을 구별할 수 있는 기능, 실행 흐름을 컨트롤할 수 있는 기능 등을 제공.
- PL/SQL은 블럭 구조로 되어 있으며,
- 블럭은 선언 부분, 실행 부분, 예외 처리 부분의 세 부분으로 구성되어 있다. (실행 부분은 반드시 존재해야 함!)
■ 형식 및 구조
/*
[DECLARE]
-- 선언문(DECLARATIONS)
BEGIN
-- 실행문(STATEMENTS)
[EXCEPTION]
-- 예외 처리문(EXCEPTION HANDLERS)
END;
*/
선언 블럭에서 변수 선언
/*
DECLARE
변수명 자료형;
변수명 자료형 := 초기값;
BEGIN
END;
*/
■ 실습
--※ 『DBMS_OUTPUT.PUT_LINE()』 을 통해
-- 화면에 결과를 출력하기 위한 환경변수 설정
SET SERVEROUTPUT ON;
--==>> 작업이 완료되었습니다.
--○ 변수에 임의의 값을 대입하고 출력하는 구문 작성
DECLARE
-- 선언부
V1 NUMBER := 10;
V2 VARCHAR(30) := 'HELLO';
V3 VARCHAR(30) := 'Oracle';
BEGIN
-- 실행부 (연산 수행)
-- System.out.println(V1); ←자바로 치자면!
DBMS_OUTPUT.PUT_LINE(V1);
DBMS_OUTPUT.PUT_LINE(V2);
DBMS_OUTPUT.PUT_LINE(V3);
END;
--==>>
/*
10
HELLO
Oracle
PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
--○ 변수에 임의의 값을 대입하고 출력하는 구문 작성
DECLARE
-- 선언부
V1 NUMBER := 10;
V2 VARCHAR2(30) := 'HELLO';
V3 VARCHAR2(30) := 'Oracle';
BEGIN
-- 실행부
-- (연산 및 처리)
V1 := V1 + 20; -- NUM1 = NUM1 + 20; → NUM1 += 20; 자바에서는! 근데 오라클에는 저렇게 쓸 수 있는거 없어용ㅠㅠ
V2 := V2 || '정한울';
V3 := V3 || 'World~!!!';
-- (결과 출력)
DBMS_OUTPUT.PUT_LINE(V1);
DBMS_OUTPUT.PUT_LINE(V2);
DBMS_OUTPUT.PUT_LINE(V3);
END;
--==>>
/*
30
HELLO정한울
OracleWorld~!!!
PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
■ 실습 (외부입력 처리)
- ACCEPT 구문 : ACCEPT 변수명 RPOMPT '메세지';
- 외부 변수로부터 입력받은 데이터를 내부 변수에 전달할 때 『&외부변수명』 형태로 접근함!
--○ 임의의 정수 2개를 외부로부터(사용자로부터) 입력받아
-- 이들의 덧셈 결과를 출력하는 PL/SQL 구문을 작성한다.
-- 실행 예)
-- 첫 번째 정수를 입력하세요 → 10
-- 두 번째 정수를 입력하세요 → 20
--==>> 10 + 20 = 30
ACCEPT N1 PROMPT '첫 번째 정수를 입력하세요';
ACCEPT N2 PROMPT '두 번째 정수를 입력하세요';
DECLARE
NUM1 NUMBER := &N1;
NUM2 NUMBER := &N2;
TOTAL NUMBER := 0;
BEGIN
TOTAL := NUM1 + NUM2;
DBMS_OUTPUT.PUT_LINE(NUM1 || ' + ' || NUM2 || ' = ' || TOTAL);
END;
--==>>
/*
13 + 24 = 37
PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
--○ 사용자로부터 입력받은 금액을 화폐단위로 구분하여 출력하는 프로그램을 작성한다.
-- 단, 입력에 대한 반환 금액은 편의상 1천원 미만, 10원 이상만 가능하다고 가정한다.
/*
실행 예)
바인딩 변수 입력 대화창 → 금액 입력 : 990
입력받은 금액 총액 : 990원
화폐단위 : 오백원 1, 백원 4, 오십원 1, 십원 4
*/
-- 내가 풀었지용~
ACCEPT MONEY PROMPT '금액 입력'
DECLARE
NUM NUMBER := &MONEY;
M1 NUMBER := 0;
M2 NUMBER := 0;
M3 NUMBER := 0;
M4 NUMBER := 0;
BEGIN
M1 := TRUNC(NUM/500);
M2 := TRUNC(MOD(NUM,500)/100);
M3 := TRUNC(MOD(MOD(NUM,500),100)/50);
M4 := TRUNC(MOD(MOD(MOD(NUM,500),100),50)/10);
DBMS_OUTPUT.PUT_LINE('입력받은 금액 총액 : ' || NUM || '원');
DBMS_OUTPUT.PUT_LINE('화폐단위 : 오백원 ' || M1 || ', 백원 : ' || M2 || ', 오십원 : ' || M3 || ', 십원 : ' || M4);
END;
-- 같이 풀었어용~
ACCEPT INPUT PROMPT '금액 입력'
DECLARE
MONEY NUMBER := &INPUT; -- 연산을 위해 입력값을 담아둘 변수
MONEY2 NUMBER := &INPUT; -- 결과 출력을 위해 입력값을 담아둘 변수
-- (MONEY 변수가 연산을 처리하는 과정에서 값이 변하기 때문에)
M500 NUMBER; -- 500원 짜리 갯수를 담아둘 변수
M100 NUMBER; -- 100원 짜리 갯수를 담아둘 변수
M50 NUMBER; -- 50원 짜리 갯수를 담아둘 변수
M10 NUMBER; -- 10원 짜리 갯수를 담아둘 변수
BEGIN
--○ 연산 및 처리
-- MONEY 를 500으로 나눠서 몫을 취하고 나머지는 버린다. → 500원의 갯수
M500 := TRUNC(MONEY / 500);
-- MONEY 를 500으로 나눠서 몫은 버리고 나머지를 취한다. → 500원의 갯수 확인하고 남은 금액
-- 이 금액으로 MONEY 를 갱신
MONEY := MOD(MONEY, 500);
-- MONEY 를 100으로 나눠서 몫을 취하고 나머지는 버린다. → 100원의 갯수
M100 := TRUNC(MONEY / 100);
-- MONEY 를 100으로 나눠서 몫은 버리고 나머지를 취한다. → 100원의 갯수 확인하고 남은 금액
-- 이 금액으로 MONEY 를 갱식
MONEY := MOD(MONEY, 100);
-- MONEY 를 50으로 나눠서 몫을 취하고 나머지는 버린다. → 50원의 갯수
M50 := TRUNC(MONEY/50);
-- MONEY 를 50으로 나눠서 몫은 버리고 나머지를 취한다. → 50원의 갯수 확인하고 남은 금액
-- 이 금액으로 MONEY 를 갱신
MONEY := MOD(MONEY, 50);
-- MONEY 를 10으로 나눠서 몫을 취하고 나머지는 버린다. → 10원의 갯수
M10 := TRUNC(MONEY/10);
-- ○ 결과 출력
-- 취합된 결과(화폐 단위별 갯수)를 형식에 맞게 최종 출력한다.
-- DBMS_OUTPUT.PUT_LINE('입력받은 금액 총액 : ' || MONEY || '원');
DBMS_OUTPUT.PUT_LINE('입력받은 금액 총액 : ' || MONEY2 || '원');
DBMS_OUTPUT.PUT_LINE('화폐 단위 : 오백원 ' || M500 || ', 백원' || M100 || ', 오십원' || M50 || ', 십원 ' || M10);
END;
--==>>
/*
입력받은 금액 총액 : 780원
화폐 단위 : 오백원 1, 백원2, 오십원1, 십원 3
PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/