DB

PL/SQL 기본 문법

매린! 2024. 5. 20. 16:49
변수

 

선언부에서 변수를 정의하고 초기화

다양한 데이터 타입을 변수로 정의 EX) number, varchar2, date, blob

SET SERVEROUTPUT ON
DECLARE
    V_XX NUMBER(4) := 10; -- 변수 선언 O, 초기값 할당 O
    V_YY NUMBER(4); -- 변수 선언 O, 초기값 할당 X 
    V_TAX_RATE CONSTANT NUMBER(5, 3) := 0.054; -- 제약사항: 상수
    V_SAL NUMBER(4) NOT NULL := 9999; -- 제약사항: NOT NULL
BEGIN
    DBMS_OUTPUT.PUT_LINE('V_XX => '||V_XX);
    DBMS_OUTPUT.PUT_LINE('V_YY => '||V_YY);
    DBMS_OUTPUT.PUT_LINE('V_YY => '||NVL(V_YY, -99)); -- 함수 사용 가능
    DBMS_OUTPUT.PUT_LINE('V_XX + V_YY => '||TO_CHAR(V_XX+V_YY)); -- NULL 연산
    DBMS_OUTPUT.PUT_LINE('V_TAX_RATE => '||V_TAX_RATE);
    
    -- V_TAX_RATE := 0.055; -- 상수를 변경하려고 하여 오류 발생 (컴파일 에러 -> 실행 조차 X)
    -- V_SAL := V_XX + V_YY; -- NULL값을 연산하려고 하여 오류 발생 (런타임 에러 -> 실행 도중 오류)
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('ERR: '||SQLERRM);
END;
/

 

연산자

 

연산자 구분 내용
산술연산자 +, /, *, -, **
비교연산자 =, !=, <>, ~=, <, >, <=, >=
논리연산자 AND, OR, NOT
SQL 연산자 LIKE, BETWEEN, IN, IS NULL
대입연산자 :=
비교연산자 =

 

DECLARE
    V_XX NUMBER(4) := 10;
    V_YY BOOLEAN;
    V_TAX_RATE NUMBER(5, 3) := 0.054;
    V_SAL NUMBER(4) := 9999;
BEGIN
    IF V_YY IS NULL THEN -- SQL 연산자
        DBMS_OUTPUT.PUT_LINE('SQL OPERATOR');
    END IF;
    
    V_YY := ((V_XX -1) ** 3 > 500) AND (V_SAL > 7000); -- 산술 연산자 & 비교 연산자 & 논리 연산자
    DBMS_OUTPUT.PUT_LINE(CASE WHEN V_YY THEN 'TRUE' ELSE 'FALSE' END); -- CASE % DECODE
    
    IF(V_SAL * V_TAX_RATE) BETWEEN 500 AND 1000 THEN -- SQL 연산자
        DBMS_OUTPUT.PUT_LINE('HIGH PAY');
    END IF;
END;
/

 

조건식

 

DECLARE
    V_EMPNO NUMBER(4) := 8888; -- 변수 선언 및 초기화
    V_DEPTNO NUMBER(2); 
    V_ENAME VARCHAR2(10) := 'XMAN'; -- 변수 선언 및 초기화
    V_JOB VARCHAR2(9);
    V_SAL NUMBER(7, 2);
BEGIN
    V_DEPTNO := 20; -- 변수에 값 대입
    IF V_JOB IS NULL THEN
        V_JOB := '신입';
    END IF;
    IF V_JOB = '신입' THEN -- TRUE, FALSE, NULL
        V_SAL := 2000;
    ELSIF V_JOB IN ('MANAGER', 'ANALYST') THEN -- ELSEIF(X)
        V_SAL := 3500;
    ELSE
        V_SAL :=2500;
    END IF;
    INSERT INTO EMP(DEPTNO, EMPNO, ENAME, SAL, JOB)
        VALUES(V_DEPTNO, V_EMPNO, V_ENAME, V_SAL, V_JOB);
        COMMIT;
END;
/

 

반복문

 

1. 기본 LOOP

EX) LOOP

        ~

        END LOOP;

DECLARE
    LOOP_INDEX NUMBER(4) := 1;
    MAX_LOOP_INDEX NUMBER(4) := 30;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE('LOOP COUNT => '||TO_CHAR(LOOP_INDEX));
        LOOP_INDEX := LOOP_INDEX + 1;
        EXIT WHEN MAX_LOOP_INDEX < LOOP_INDEX;
    END LOOP;
END;
/

 

  • LOOP로 시작하고 END LOOP로 종료, END LOOP 다음에 세미콜론(;)을 문장 종결자로 사용
  • LOOP 구문 사용 시 명시적으로 LOOP를 종료하는 EXIT절 사용

 

2. FOR LOOP

EX) FOR ~

       LOOP

       ~

       END LOOP;

 

  • FOR LOOP는 기본 LOOP 반복문에 LOOP INDEX를 제어하는 LOOP COUNTER 기능이 추가된 형태
loop_index 특징
- block 내에서 정수 데이터타입으로 암시적, 자동으로 선언
- 증가, 감소 폭은 1, 증가폭 변경 불가(참조만 가능)
lower_bound .. upper_bound: loop_index가 실행되는 시작(하한값) 및 종료(상한값) 범위
  • FOR문은 항상 하한값이 앞에 오고 상한값이 뒤에 와야 함 ---> 상한값이 앞에 올 시 오류 발생
    • 상한값에서 -1씩 줄이고 싶다면 REVERSE 사용하면 
    • REVERSE ~ UPPER BOUND에서 LOWER BOUND로 1씩 감소
SET SERVEROUTPUT ON
DECLARE
    LOOP_INDEX NUMBER(4) := 1;
    MAX_LOOP_INDEX NUMBER(4) := 30;
BEGIN
    FOR LOOP_INDEX IN 1..MAX_LOOP_INDEX
    -- FOR LOOP_INDEX IN 30..1 -- 하한값이 먼저 와서 오류 발생
    FOR LOOP_INDEX IN REVERSE 1..30
    -- FOR LOOP_INDEX IN REVERSE 30..1 -- 하한값이 먼저 와서 오류 발생
    LOOP
        DBMS_OUTPUT.PUT_LINE('COUNT: '||TO_CHAR(LOOP_INDEX));
    END LOOP;
END;
/

 

 

3. WHILE LOOP

EX) WHILE ~

        LOOP

        ~

        END LOOP;

 

  • 기본적인 LOOP 반복문에 BOOLEAN CHECK 기능 추가
  • FOR LOOP는 일정한 횟수만큼 LOOP를 반복하는 반면 WHILE LOOP는 조건식이 참(TRUE)일 동안 반복
  • 조건식이 TRUR일 경우만 실행되고 FALSE나 NULL인 경우 실행되지 않음
    • PL/SQL에서는 boolean값으로 TRUE, FALSE, NULL까지 올 수 있음
DECLARE
    -- V_INDEX NUMBER(3) := 0; -- 1번 실행됨
    -- V_INDEX NUMBER(3); -- NULL 값이기 때문에 실행안됨
    V_INDEX NUMBER(3) := 30; -- 31번 실행됨
BEGIN
    WHILE(V_INDEX >= 0)
    LOOP
        DBMS_OUTPUT.PUT_LINE('While loop ['||TO_CHAR(V_INDEX)||']');
        V_INDEX := V_INDEX - 1;
    END LOOP;
END;
/