PL/SQL
익명 블록 : 한번만 실행
선언부(DECLARE) : 모든 변수나 상수 선언
실행부(BEGIN) : 제어문, 반복문, 함수 정의 등의 로직 구현, END로 끝남, 필수블록
예외처리부(EXCEPTION) : 에러발생을 대비한 예외처리
- SET SERVEROUTPUT ON : PL/SQL 실행 결과를 화면에 출력하기 위해서 환경변수를 활성화 시켜줘야함
SET SERVEROUTPUT ON; -- PL/SQL 결과 화면 출력기능 활성화
[DECLARE
선언부]
BEGIN
실행부
[EXCEPTION 예외처리부]
END;
DECLARE
v_number NUMBER(4);
v_name VARCHAR2(10);
v_tax CONSTANT NUMBER(2) := 4; -- 상수 할당
v_deptno NUMBER(3) DEFAULT 100; -- 기본값
v_allno NUMBER(2) NOT NULL DEFAULT 10 -- NOT NULL, 기본값
BEGIN
v_number := 5;
DBMS_OUTPUT.PUT_LINE('v_number : ' || v_number);
END;
/
자료형
- 스칼라형 : 기본타입(NUMBER, VARCHAR2, DATE, BOOLEAN 등)
- 참조형 : 존재하는 테이블에서 자료형 가져오기 (%TYPE : 열 자료형, %ROWTYPE : 행 자료형)
DECLARE
vno emp.empno%TYPE;
vname emp.ename%TYPE;
vsal emp.sal%TYPE;
BEGIN
SELECT empno, ename, sal INTO vno, vname, vsal -- INTO : 변수에 컬럼 넣기
FROM emp
WHERE empno = 7900;
dbms_output.put_line(vno || ' ' || vname || ' '|| vsal);
END;
DECLARE
v_row emp%ROWTYPE;
BEGIN
SELECT * INTO v_row
FROM emp
WHERE empno = 7900;
dbms_output.put_line(v_row.empno || ' ' || v_row.ename || ' '|| v_row.sal);
END;
- 복합형 : 여러 종류 및 갯수의 데이터가 담긴 사용자 정의 자료형
레코드 : 자료형이 다른 데이터 저장 (like 자바의 클래스)
DECLARE
TYPE 레코드명 IS RECORD(
no NUMBER(2),
name VARCHAR2(10)
);
v_변수 레코드명; -- 레코드의 변수선언
BEGIN
no := 10;
DBMS_OUTPUT.PUT_line('no : ' || v_변수.no);
END;
컬렉션 : 자료형이 같은 데이터 저장(테이블 타입) (like 배열)
DECLARE
t_name VARCHAR2(20);
TYPE 컬렉션명 IS TABLE OF 자료형
INDEX BY 인덱스형;
v_변수 컬렉션명; -- 컬렉션의 변수선언
BEGIN
SELECT ename INTO t_name
FROM emp
WHERE empno = 7499;
v_변수(0) := t_name;
dbms_output.put_line(v_변수(0));
END;
○ 조건문 : IF-ELSIF-ELSE, CASE
IF (v_sal >= 5000) THEN
v_tax := v_sal*0.05;
ELSIF (v_sal BETWEEN 4000 AND 4999) THEN
v_tax := v_sal*0.04;
ELSIF (v_sal BETWEEN 3000 AND 3999) THEN
v_tax := v_sal*0.03;
ELSIF (v_sal BETWEEN 2000 AND 2999) THEN
v_tax := v_sal*0.02;
ELSE
v_tax := v_sal*0.01;
END IF;
○ 반복문 : 기본루프, FOR, WHILE
DECLARE
num NUMBER := 0;
BEGIN
loop
dbms_output.put_line(num);
num := num +1;
exit WHEN num > 5;
END loop;
END;
BEGIN
FOR i IN [REVERSE] 0..5 loop -- 0 <= i <= 5
dbms_output.put_line(i);
CONTINUE WHEN i >10;
END loop;
END;
DECLARE
num NUMBER := 0;
BEGIN
WHILE (num < 6) loop
dbms_output.put_line(num);
num := num +1;
END loop;
END;
○ 예외처리 : 예외명, 예외번호를 알아야 처리, 생성 가능
DECLARE ~생략~
BEGIN ~생략~
EXCEPTION
WHEN 예외명1 THEN
dbms_output.put_line('SQLCODE : ' || SQLCODE); -- 오류번호
dbms_output.put_line('SQLERRM : ' || SQLERRM); -- 오류메시지
WHEN 예외명2 THEN
dbms_output.put_line('SQLCODE : ' || SQLCODE);
dbms_output.put_line('SQLERRM : ' || SQLERRM);
END;
-- 사용자 정의 예외처리 --
DECLARE
new_msg exception; -- 예외명 : new_msg
pragma exception_init(new_msg, -1); -- pragma exception_init(예외명, 예외코드)
BEGIN
INSERT INTO t_pragma VALUES (1, 'CCC');
exception
WHEN new_msg THEN
dbms_output.put_line('존재하는 번호입니다.');
END;
- 예외처리 발생시키기 : raise 키워드 or raise_application_error(에러코드, 에러메시지) 사용
-> raise_application_error : 사용자 에러코드 함수로써 에러코드범위는 -20000 ~ -20999
DECLARE
v_empno emp.empno%TYPE;
v_name emp.ename%TYPE;
no_empno exception; -- exception 선언
BEGIN
DELETE FROM emp WHERE empno = &empno;
IF SQL%notfound THEN
RAISE no_empno; -- exception 발생
-- raise_application_error(-20100, '사원이 없습니다.');
END IF;
exception
WHEN no_empno THEN -- exception 처리
dbms_output.put_line('사원이 없습니다.');
END;
저장 서브프로그램 : 이름 지정해서 저장 후 호출
- 프로시저, 트리거, 사용자 정의 함수, 패키지
프로시저 | 함수 | |
실행 | EXEC 명렁어, PL/SQL 내 (SQL문에서는 사용 X) |
PL/SQL 내 (SQL문에서 사용 O) |
파라미터 | IN, OUT, IN OUT (3개) | IN (1개) - 생략가능 |
반환값 | 0~여러개(OUT 모드) | 오직 1개(RETURN문) |
● 에러 확인
SHOW ERRORS;