본문 바로가기

02. SQLP 스터디/05. Oracle 기타

[오라클 PL/SQL] 1/45

 
오라클 PL/SLQ이란? PLSQL개요, 작성방법, 기본문법에 관해 설명한 동영상 입니다.

PL/SQL 이란?

PL/SQL은 PROCEDUAL LANGUAGE/SQL의 약어로 “SQL 구문을 절차적인 형태로 프로그래밍 할 수 있게 한 SQL의 확장” 입니다.
PL/SQL은 BEGIN~END 사이에 PL/SQL 코드를 기술하여 비지니스 로직 처리를 하는데 DML문, 절차적 언어의 IF문과 같은 제어문, 반복문(LOOP~END LOOP) 등을 사용하여 SQL을 이용하여 프로그래밍이 가능하도록 한 것입니다.

PL/SQL은 DECLARE로 선언되는 익명 블록과, 값을 반드시 리턴하는 함수(FUNCTION), 실행만 하는 프로시저(PROCEDURE), 트리거링 이벤트에 의해 자동 실행되는 프로시저인 트리거(Trigger), 비슷한 기능을 하는 함수, 프로시저를 묶어 놓은 패키지 등이 있습니다.

익명 블럭은 오라클 서버에서 컴파일되어 SGA의 SHARED POOL에 위치시키지만 소스코드와 컴파일된 코드를 별도로 저장하지는 않습니다.
함수나 프로시저, 패키지, 트리거는 STORED PROGRAM 이라 하며 데이터베이스 SCHEMA OBJECTS로 저장되고 호출되어 실행된다.
PL/SQL로 작성된 구문중 절차적 언어와 같은 구문, PL/SQL 기본문법구문은 PROCEDUAL STATEMENT EXECUTOR에서 실행하고 SQL구문은 SQL STATEMENT EXECUTOR에서 실행 합니다.
PL/SQL 프로그램은 오라클 서버에서 컴파일 되고 저장되며, 클라이언트에 의해 호출되어 실행 됩니다

PL/SQL 장점

BEGIN~END와 같은 블록 구조를 가지므로 블록 안의 여러 SQL 구문이 한번에 서버로 전송되므로 수행속도가 향상되고 통신량도 줄일 수 있습니다.
블록안에 또 다른 블록을 포함하는 형태로 코드를 모듈화 할 수 있습니다.
단일형 데이터 타입(SCALAR DATA TYPE), 복합데이터 타입(COMPOSITE DATA TYPE), 상수 등 여러 형태의 변수 선언이 가능하다.
테이블의 컬럼을 참조하는 동적 변수를 정의 할 수 있습니다.(%TYPE, %ROWTYPE)
IF문과 같은 조건문을 사용할 수 있습니다.
LOOP~END LOOP, FOR..LOOP~END LOOP, WHILE .. LOOP~END LOOP와 같은 반복문을 사용할 수 있습니다.
Exception절을 이용하여 프로그래밍 언어처럼 예외(오류)를 처리 할 수 있으며 사용자 정의 예외의 사용도 가능 합니다.

 
PL/SQL 작성방법

명령문의 종료는 세미콜론(;) 입니다.
CREATE 구문을 사용했다면 실행을 위해 마지막에 슬래시(‘/’)가 필요 합니다.
익명의 블록을 만들기 위해서는 DECLARE 구문으로, 이름있는 블록을 만들기 위해서는 CREATE 구문을 사용해야 합니다.
하나의 BEGIN에 대응되는 END 구문은 하나이며 세미콜론(;)으로 끝나야 하고, 
END 다음에 CREATE 구문에서 사용된 함수나 프로시저의 이름을 써줘도 된다.

create procedure A as

begin

end A;
/

Declare로 선언된 익명블록인 경우 컴파일시 에러가 발생하면 에러 코드/메시지를 하단에 보여주지만 CREATE로 시작하는 함수나 프로시저는 오류 발생시 SHOW ERRORS(ERROR)로 확인해야 한다.

SQL> SHOW ERRORS

LINE/COL              ERROR
-------------  ----------------------------------------------------------------
10/13           PL/SQL: SQL Statement ignored
11/10           PLS-00201: ‘EMP.SAL' …..



PL/SQL 블록 구조

DECLARE 
     Variable declaration
BEGIN 
     Program Execution 
……
EXCEPTION 
     Exception handling
   ……
END;

[PL/SQL 블록 구조]

Declare절 : 선언부로써 필수는 아님, 변수 or 커서 등을 선언한다. 이름을 정의하고 재 사용할 PL/SQL 블록을 만들기 위해서는 CREATE구문을 사용해야 합니다.

변수선언예 
goodsNo  NUMBER(4);
isLogin    BOOLEAN;
ename    VARCHAR2(20);

커서 선언 예
 Declare
           Cursor cEmp is select empno, ename from emp where deptno = 10;
 Begin
 ……  
 End; 
/

Begin ~ End절 : 필수 요소이며 절차적 언어의 특징 및 SQL을 사용하여 비즈니스 로직을 구현 합니다.
Exception절 : 예외처리절(프로그래밍 언어의 CATCH구문) 입니다.

[PL/SQL 예문1]
-- FOR LOOP예제
SET SERVEROUTPUT ON

DECLARE
    BEGIN
      FOR x IN 1..10 LOOP
         DBMS_OUTPUT.PUT_LINE(x);
      END LOOP;
    END;
    /
1

10
 
-- FOR LOOP예제(REVERSE)
DECLARE
    BEGIN
      FOR x IN REVERSE 1..10 LOOP
         DBMS_OUTPUT.PUT_LINE(x);
      END LOOP;
    END;
    /
10
9