PL/SQL의 기본구조

PL/SQL이란? (Procedural Language extension to sql)

  • Oracle 에서 SQL을 확장하여 사용할 수 있도록 만든 절차적 프로그래밍 언어
  • db에 직접 탑재되어 compile되고 실행된다.

기본 구조

기본 단위는 Block 으로 이루어진다.
Block은 선언부 , 실행부 , 예외처리부 로 구성되는데, 익명 블록과 이름이 있는 블록 (함수,프로시저,패키지) 로 나뉜다.

1
2
3
4
5
6
7
이름부 ## BLOCK의 명칭이 오는 자리 
IS (AS)
선언부 ## DECLARE로 시작되며, 실행부와 예외처리부에서 사용할 변수 정의
BEGIN
실행부 ## 비즈니스 로직
EXCEPTION
예외처리부 ## EXCEPTION 절로 시작되는 부분으로 비즈니스 로직을 처리하다가 오류가 생기면 실행되는 내용
  • 기본구조에서 이름부와 예외처리부는 생략이 가능하며 , 이름부를 생략할 경우에는 익명 블록이라고 한다.

예제를 보면 다음과 같다.

1
2
3
4
5
6
7
8
9
SET SERVEROUT ON; -- 입출력 ON
SET TIMING ON; -- PL/SQL 블록 실행시간 출력
DECLARE
vi_num NUMBER; --선언부
BEGIN
vi_num := 100; -- 실행부
DBMS_OUTPUT.PUT_LINE(vi_num);
END;

변수 선언

특이하게 PL/SQL에서는 변수 선언 방식이 다음과 같다. 만약 초기값을 넣지 않으면 기본적으로 NULL이 된다.

1
변수명 데이터타입 := 초깃값;

여기서 데이터타입은 SQL 또는 PL/SQL 데이터 타입이 들어갈 수 있다.

자세한 PL/SQL 데이터 타입은 공식문서(https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/datatypes.html) 에서 확인이 가능하다.

상수 선언은 변수 선언과 달리 CONSTANT 라는 키워드를 붙여주면 된다.

1
상수명 CONSTANT 데이터타입 := 상수값; 

사용예시

PL/SQL 블록을 작성하는 주 목적은 테이블 상에 있는 데이터를 가공해서 특정 로직에 따라 무언가를 처리하는 것이다. (DML문 사용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SET SERVEROUTPUT ON;
DECLARE
vs_emp_name VARCHAR2(80); -- 사원명 변수
vs_dep_name VARCHAR2(80); -- 부서명 변수
BEGIN
SELECT
a.emp_name,
b.department_name
INTO
vs_emp_name , vs_dep_name
FROM
employees a ,
departments b
WHERE
a.department_id = b.department_id AND
a.employee_id = 100;
DBMS_OUTPUT.PUT_LINE(vs_emp_name || '-' || vs_dep_name);
END;
  • 위에 쿼리를 보면 SELECT문에서 INTO절을 사용한다. 즉 테이블에서 데이터를 가져와서 BLOCK에서 선언한 변수에 할당할때는 INTO 절을 사용한다는 뜻이다. 이때 선택하는 칼럼에 따라, 변수의 순서 , 개수 , 데이터 타입을 반드시 맞춰 줘야 한다.

  • 이떄 선택하는 칼럼의 변수 타입을 일일히 맞춰주기 번거로울 수가 있는데 이떄는 테이블의 변수타입을 가지고 오는 문법을 지원한다.

1
2
3
4
5
6

DECLARE
vs_emp_name employees.emp_name%TYPE; -- 사원명 변수
vs_dep_name departments.department_name%TYPE; -- 부서명 변수
BEGIN
/***/
  • %TYPE 키워드를 사용하면 해당 테이블의 칼럼의 데이터 타입을 가져올 수 있다.

PRAGMA 키워드

  • compiler가 실행되기 전에 처리하는 전처리기 역할을 한다.
  • compiler가 뭔가를 처리하라고 지시하는 역할을 하는데, PL/SQL 블록 선언부에 명시한다.
  1. PRAGMA AUTONOMOUS_TRANSACTION

    transaction 처리를 담당하는데, 다른 transaction과는 독립적으로 현재 블록 내부에서 일어난 데이터베이스에 가해진 변경사항을 COMMIT 또는 ROLLBACK하라고 지시하는 역할을 수행한다.

  2. PRAGMA EXCEPTION_INIT(예외명,예외번호)

    사용자 정의 예외 처리를 할 떄 사용되는데, 특정 예외번호를 명시해서 compiler에 이 예외를 사용한다는 것을 알리는 역할을 한다.

  3. PRAGMA SERIALLY_RESUABLE
    패키지 메모리 관리를 쉽게 할 목적으로 사용되며, 패키지에 선언된 변수에 대해 한번 호출한 뒤 메모리를 해제 시킨다. 즉 해당 변수가 다음변수 호출되면 초기화된 값이나 NULL값으로 호출된다.

라벨

PL/SQL 프로그램 상에서 특정 부분에 이름을 부여할 수 있는데 이를 라벨이라고 하며 <<라벨>> 형태로 사용한다.

  • 라벨을 사용하는 이유 : 코드가 길어질때 소스 코드 관리를 위함.

Comments