📚 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 프로시저가 성공적으로 완료되었습니다.
*/