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;
/