구성 키워드 | 필수/선택 | 설명 |
---|---|---|
DECLARE(선언부) | 선택 | 실행에 사용될 변수, 상수, 커서 등을 선언 |
BEGIN(실행부) | 필수 | 조건문, 반복문, SELECT, DML, 함수 등을 정의 |
EXCEPTION(예외 처리부) | 선택 | PL/SQL 실행 도중 발생하는 오류(예외 상황)를 해결하는 문장 기술 |
DECLARE
[ 실행에 칠요한 여러 요소 선언];
BEGIN
[작업을 위해 실제 실행하는 명령어];
EXCEPTION
[PL/SQL 수행 도중 발생하는 오류 처리];
END;
변수 이름 자료형 := 값 또는 값이 도출되는 여러 표현식;
변수 이름 CONSTANT 자료형 := 값 또는 값을 도출하는 여러 표현식
변수 이름 DEFAULT 자료형 := 값 또는 값을 도출하는 여러 표현식
변수 이름 NOT NULL 자료형 := 또는 DEFAULT 값 또는 값을 도출하는 여러 표현식
:= 를 사용하여 선언과 동시에 값을 할당하고 DEFAULT 키워드를 사용하여 변수의 기본값으로 설정할 수도 있다.
변수에 NOT NULL을 설정하고 값을 대입한 후 출력하기
변수에 NOT NULL 및 기본값을 설정한 후 출력하기
스칼라형은 숫자, 문자열, 날짜 등과 같이 오라클에서 기본으로 정의해 놓은 자료형으로 내부 구성 요소가 없는 단일 값을 의미한다.
스칼라형은 숫자, 문자열, 날짜, 논리 데이터로 나뉜다.
분류 | 자료형 |
---|---|
숫자 | NUMBER |
문자열 | CHAR |
문자열 | VARCHAR2 |
날짜 | DATE |
논리 데이터 | BOOLEAN |
변수 이름 테이블이름.열이름%TYPE;
참조형(열)의 변수에 값을 대입한 후 출력하기
특정 테이블에서 하나의 열이 아닌 행 구조 전체를 참조할 때 %ROWTYPE을 사용한다.
변수 이름 테이블이름.열이름%ROWTYPE;
SQL> DECLARE
2 V_DEPT_ROW DEPT%ROWTYPE;
3 BEGIN
4 SELECT DEPTNO, DNAME, LOC INTO V_DEPT_ROW
5 FROM DEPT
6 WHERE DEPTNO = 40;
7 DBMS_OUTPUT.PUT_LINE('DEPTNO : ' || V_DEPT_ROW.DEPTNO);
8 DBMS_OUTPUT.PUT_LINE('DNAME : ' || V_DEPT_ROW.DNAME);
9 DBMS_OUTPUT.PUT_LINE('LOC : ' || V_DEPT_ROW.LOC);
10 END;
11 /
스칼라형과 참조형 외에도 PL/SQL에서는 복합형과 LOB형을 사용할 수 있다.
복합형: 여러 종류 및 개수의 데이터를 저장하기 위해 사용자가 직접 정의하는 자료형
분류 | 자료형 | 설명 |
---|---|---|
컬렉션 | TABLE | 한 가지 자료형의 데이터를 여러 개 저장(테이블의 열과 유사) |
레코드 | RECORD | 여러 종류 자료형의 데이터를 저장(테이블의 행과 유사) |
Large Object를 의미하는 LOB형은 대용량의 텍스트, 이미지, 동영상, 사운드 데이터 등 대용량 데이터를 저장하기 위한 자료형으로 대표적으로 BLOB, CLOB 등이 있다.
IF 조건식 THEN
수행할 명령어;
END IF;
DECLARE
V_NUMBER NUMBER := 13;
BEGIN
IF MOD(V_NUMBER, 2) = 1 THEN
DBMS_OUTPUT.PUT_LINE('V_NUMBER는 홀수입니다!');
END IF;
END;
/
DECLARE
V_NUMBER NUMBER := 14;
BEGIN
IF MOD(V_NUMBER, 2) = 1 THEN
DBMS_OUTPUT.PUT_LINE('V_NUMBER는 홀수입니다!');
END IF;
END;
/
IF 조건식 THEN
수행할 명령어;
ELSE
수행할 명령어;
END IF;
DECLARE
V_NUMBER NUMBER := 14;
BEGIN
IF MOD(V_NUMBER, 2) = 1 THEN
DBMS_OUTPUT.PUT_LINE('V_NUMBER는 홀수입니다!');
ELSE
DBMS_OUTPUT.PUT_LINE('V_NUMBER는 짝수입니다!');
END IF;
END;
/
IF 조건식 THEN
수행할 명령어;
ELSIF 조건식
수행할 명령어;
ELSIF 조건식
수행할 명령어;
...
ELSE
수행할 명령어;
END IF;
DECLARE
V_SCORE NUMBER := 87;
BEGIN
IF V_SCORE >= 90 THEN
DBMS_OUTPUT.PUT_LINE('A학점');
ELSIF V_SCORE >= 80 THEN
DBMS_OUTPUT.PUT_LINE('B학점');
ELSIF V_SCORE >= 70 THEN
DBMS_OUTPUT.PUT_LINE('C학점');
ELSIF V_SCORE >= 60 THEN
DBMS_OUTPUT.PUT_LINE('D학점');
ELSE
DBMS_OUTPUT.PUT_LINE('F학점');
END IF;
END;
/
CASE 비교 기준
WHEN 값1 THEN
수행할 명령어;
WHEN 값2 THEN
수행할 명령어;
...
ELSE
수행할 명령어;
END CASE;
DECLARE
V_SCORE NUMBER := 87;
BEGIN
CASE TRUNC(V_SCORE/10)
WHEN 10 THEN DBMS_OUTPUT.PUT_LINE('A학점');
WHEN 9 THEN DBMS_OUTPUT.PUT_LINE('A학점');
WHEN 8 THEN DBMS_OUTPUT.PUT_LINE('B학점');
WHEN 7 THEN DBMS_OUTPUT.PUT_LINE('C학점');
WHEN 6 THEN DBMS_OUTPUT.PUT_LINE('D학점');
ELSE DBMS_OUTPUT.PUT_LINE('F학점');
END CASE;
END;
/
CASE
WHEN 조건식1 THEN
수행할 명령어;
WHEN 조건식2 THEN
수행할 명령어;
...
ELSE
수행할 명령어;
END CASE;
DECLARE
V_SCORE NUMBER := 87;
BEGIN
CASE
WHEN V_SCORE >= 90 THEN DBMS_OUTPUT.PUT_LINE('A학점');
WHEN V_SCORE >= 80 THEN DBMS_OUTPUT.PUT_LINE('B학점');
WHEN V_SCORE >= 70 THEN DBMS_OUTPUT.PUT_LINE('C학점');
WHEN V_SCORE >= 60 THEN DBMS_OUTPUT.PUT_LINE('D학점');
ELSE DBMS_OUTPUT.PUT_LINE('F학점');
END CASE;
END;
/
LOOP
반복 수행작업;
END LOOP;
DECLARE
V_NUM NUMBER := 0;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('현재 V_NUM : ' || V_NUM);
V_NUM := V_NUM + 1;
EXIT WHEN V_NUM > 4;
END LOOP;
END;
/
WHILELOOP문은 반복 수행 여부를 결정하는 조건식을 먼저 지정한 후 조건식의 결과 값이 true일 때 조건을 반복하고, false가 되면 반복을 끝낸다.
WHILE 조건식 LOOP
반복 수행 작업;
END LOOP;
DECLARE
V_NUM NUMBER := 0;
BEGIN
WHILE V_NUM < 4 LOOP
DBMS_OUTPUT.PUT_LINE('현재 V_NUM : ' || V_NUM);
V_NUM := V_NUM + 1;
END LOOP;
END;
/
FOR i IN 시작 값 .. 종료 값 LOOP
반복 수행 작업;
END LOOP;
BEGIN
FOR i IN 0..4 LOOP
DBMS_OUTPUT.PUT_LINE('현재 i의 값 : ' || i);
END LOOP;
END;
/
FOR i IN REVERSE 시작 값 .. 종료 값 LOOP
반복 수행 작업;
END LOOP;
BEGIN
FOR i IN REVERSE 0..4 LOOP
DBMS_OUTPUT.PUT_LINE('현재 i의 값 : ' || i);
END LOOP;
END;
/
BEGIN
FOR i IN 0..4 LOOP
CONTINUE WHEN MOD(i, 2) = 1;
DBMS_OUTPUT.PUT_LINE('현재 i의 값 : ' || i);
END LOOP;
END;
/
Q1.
BEGIN
FOR i IN 1..10 LOOP
CONTINUE WHEN MOD(i, 2) = 0;
DBMS_OUTPUT.PUT_LINE('현재 i의 값 : ' || i);
END LOOP;
END;
/
Q2.
DECLARE
V_DEPTNO DEPT.DEPTNO%TYPE := 10;
BEGIN
CASE V_DEPTNO
WHEN 10 THEN DBMS_OUTPUT.PUT_LINE('DNAME : ACCOUNTING');
WHEN 20 THEN DBMS_OUTPUT.PUT_LINE('DNAME : RESEARCH');
WHEN 30 THEN DBMS_OUTPUT.PUT_LINE('DNAME : SALES');
WHEN 40 THEN DBMS_OUTPUT.PUT_LINE('DNAME : OPERATIONS');
ELSE DBMS_OUTPUT.PUT_LINE('DNAME : N/A');
END CASE;
END;
/