DECLARE —선택
—변수, 상수, 커서, 사용자 지정 예외 선언
BEGIN —필수
—SQL 문장
—PL/SQL 제어 문장
EXCEPTION —선택
—에러 발생시 수행될 액션
END; —필수
이름이 없는 PL/SQL블록
저장 프로시저 및 함수
매개 변수를 받을 수 있고, 반복해서 사용할 수 있는 이름이 있는 PL/SQL블록
패키지
관련된 저장 프로시저, 함수를 모은 이름이 있는 PL/SQL
트리거
데이터베이스의 테이블과 연결되어 자동적으로 실행되는 이름이 있는 PL/SQL블록
⇒ 대개의 경우 익명 블록 형태가 아닌 형태(저장 프로시저, 함수, 패키지, 트리거)로 사용
일반 숫자값(예:123, -4.6)
지수로 표현된 숫자 값(예:1.43E5)
문자
작은 따옴표로 구분된 문자열(예:’STRING’)
불리언
TRUE, FALSE
NULL
Set ServerOutput On
DBMS_OUTPUT.PUT_LINE(문자형값);
출력 방법 예)
Set ServerOutput On
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World');
END;
출력 결과
> Hello World
개요
SQL에서 제공하는 모든 데이터 타입 + 추가 데이터 타입 제공
PL/SQL추가 데이터 타입
: BOOLEAN, %TYPE, %ROWTYPE, PL/SQL레코드 등
데이터 타입의 유형
스칼라 데이터 타입
: 일반 단일 데이터 타입(NUMBER, CHAR, …), %TYPE
복합 데이터 타입
: %ROWTYPE, PL/SQL 레코드, PL/SQL 테이블
참조 데이터 타입
변수 선언
형식
식별자 [CONSTANT] 데이터타입 [NOT NULL] [:=상수 값이나 표현식];
스칼라 데이터 타입
단수 데이터형으로 하나의 데이터 값을 저장하는 데이터 타입
예시
v_gender : CHAR(1);
v_total_sal : NUMBER(9):=0;
v_order_date : DATE := SYSDATE + 7;
c_tax_rate : CONSTANT NUMBER(3,2) := 8.25;
v_valid : BOOLEAN NOT NULL := TRUE;
%TYPE데이터타입
v_empno emp.empno%TYPE := 7900;
→ v_empno의 데이터 타입 : emp테이블의 empno컬럼의 데이터 타입 v_ename emp.enname%TYPE;
→ v_ename의 데이터 타입 : emp테이블의 ename컬럼의 데이터 타입 DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT ename, sal
INTO v_ename, v_sal
FROM emp
WHERE empno = 7369;
DBMS_OUTPUT.PUT_LINE('Name:'||v_ename);
DBMS_OUTPUT.PUT_LINE('Salary:'||TO_CHAR(v_sal));
END;
하나 이상의 데이터 값을 가지는 데이터 타입
%ROWTYPE, PL/SQL 레코드
%ROWTYPE
테이블이나 뷰 내부의 컬럼 집합의 이름, 데이터 타입, 크기, 속성을 그대로 사용
%ROWTYPE앞에 오는 것은 테이블명
예시)
DECLARE
v_emp emp%ROWTYPE;
BEGIN
SELECT empno, ename
INTO v_emp.empno, v_emp.ename
FROM emp
WHERE empno=7369;
DBMS_OUTPUT.PUT_LINE('No:'||TO_CHAR(v_emp.empno);
DBMS_OUTPUT.PUT_LINE('Name:'||(v_emp.ename);
END;
PL/SQL레코드
TYPE type_ename IS RECORD
(필드이름1 데이터타입,
필드이름2 데이터타입, ..);
Identifier type_name;
DECLARE
TYPE emp_record IS RECORD
(v_ename VARCHAR2(30),
v_job VARCHAR2(9));
emp_rec emp_record;
BEGIN
SELECT ename, job
INTO emp_rec.v_ename, emp_rec.v_job
FROM emp
WHERE empno = 7369;
DBMS_OUTPUT.PUT_LINE('Name:'||emp_rec.v_ename);
DBMS_OUTPUT.PUT_LINE('Name:'||(emp_rec.v_job);
END;
💡 PL/SQL 제어문
IF condition THEN
statements;
[ELSEIF condition THEN
statements;]
[ELSE
statements;]
END IF;
예)DECLARE
sMonth CHAR(2);
BEGIN
sMonth:=TO_CHAR(SYSDATE,'MIM');
IF(sMonth>='03' and sMonth<='08')THEN
DBMS_OUTPUT.PUT_LINE('1학기');
ELSE
DBMS_OUTPUT.PUT_LINE('2학기');
END IF;
END;
형식)
LOOP
statements;
...
EXIT [WHEN condition];
END LOOP;
예)
DECLARE
i NUMBER :=0;
nSum NUMBER :=0;
BEGIN
LOOP
i :=i+1;
nSum := nSum +i;
EXIT WHEN i>=100;
END LOOP;
DBMS_OUTPUT.PUT_LINE('1~100까지의 합:'||TO_CHAR(nSum));
END;
FOR-LOOP
형식)
FOR index in [REVERSE] 시작값..끝값 LOOP
statements;
END LOOP;
예시)
DECLARE
i NUMBER :=0;
nSum NUMBER :=0;
BEGIN
FOR i IN 1..100 LOOP
nSum := nSum + i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('1~100까지의 합:'||TO_CHAR(nSum));
END;
WHILE-LOOP
형식)
WHILE condition LOOP
statements;
...
END LOOP;
예)
DECLARE
i NUMBER :=0;
nSum NUMBER :=0;
BEGIN
WHILE i<100 LOOP
i:=i+1;
nSum:=nSum+i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('1~100까지의 합:'||TO_CHAR(nSum));
END;
DECLARE
i NUMBER:=0;
nSum NUMBER:=0;
BEGIN
WHILE TRUE LOOP
i := i+1;
nSum:=nSum+i;
IF i>=100 THEN
EXIT;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('1~100까지의 합:'||TO_CHAR(nSum));
END;
NULL