[Oracle] PL/SQL - 개념과 예제
PL/SQL 이란?
- Procedural Language / Sturctured Query Language
- SQL에 프로그래밍 언어 설계 기능을 절차적으로 추가한 것
- 오라클사가 데이터베이스에서 SQL에 대해 절차적 로직을 실행하는 방법을 제공하기 위해 개발한 절차적 언어
- 데이터 캡슐화, 예외 처리, 정보 숨김, 객체 지향 등의 현대 S/W 공학 기능 제공
- SQL문을 블록 구조 및 프로시저 단위 코드에 포함시킬 수 있는 강력한 트랜잭션 처리 언어
PL/SQL 처리과정
- 오라클 선행 컴파일러에서 PL/SQL 블록(코드)를 제출하면 Oracle Server 내의 PL/SQL 엔진이 이를 처리한다.
- PL/SQL 엔진은 블록 내의 SQL문을 분리하여 하나씩 SQL문 실행자로 전송한다.
- PL/SQL 코드는 Oracle Server 에 저장할 수 있으며, 이름 앞에 Stored를 붙여 부른다. (Stored Procedure)
- Oracle Developer 와 같은 오라클 툴에는 Oracle Server의 엔진과는 별도로 자체 PL/SQL 엔진이 존재한다.
※ 패키지 확인
SQL> SELECT OBJECT_NAME FROM DBA_OBJECTS
WHERE OWNER = 'SYS' AND OBJECT_TYPE = 'PACKAGE';
PL/SQL Block 구조
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DECLARE
변수 선언문;
BEGIN
프로그램 코드;
EXCEPTION
예외 처리문;
END;
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- 변수선언문 : 블럭에서 사용할 변수를 정의. 커서 정의와 중첩된 PL/SQL 프로시저 및 함수도 여기서 정의.
- 프로그램코드 : 블럭을 구성하는 PL/SQL 문.
- 예외처리문 : 런타임 오류나 예외 발생시 트리거되는 프로그램 코드.
- 각 블럭에서 문장의 끝을 알리기 위해 반드시 세미콜론(;)을 붙인다.
- BEGIN 내에 다른 블럭을 내포할 수 있다.
[예제1] 간단한 작성과 실행
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DECLARE
x NUMBER;
BEGIN
x := 100;
END;
/
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- 맨 끝의 '/' 슬래시는 SQL*Plus에게 PL/SQL 코드의 입력이 끝났음을 알리고 이를 오라클 데이터베이스로 보내는 역할.
[예제2] 결과 출력하기
- 출력은 DBMS_OUTPUT 패키지가 담당한다.
- 패키지 안에 dbms_output.put_line 프로시저 사용.
- 출력을 SQL*Plus 에서 보려면
SQL> SET SERVEROUTPUT ON 을 먼저 실행해야 한다.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
DECLARE
x NUMBER;
BEGIN
x := 65400;
dbms_output.put_line('The variable x = ');
dbms_output.put_line(x);
END;
/
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- 내용을 /export/home/oracle/plsql/test.sql 파일에 저장하고 불러들일 수도 있다. 기본확장자는 .sql 이다.
- 간단한 내용은 vi editor를 통해 수정하면 되겠지만, Buffer는 바로 직전의 SQL문만 저장하고 있기 때문에 긴 PL/SQL 프로시저는 반드시 텍스트파일로 만들어서 실행시키는 형식을 취하도록 한다.
$ vi /export/home/oracle/plsql/test.sql
내용기입
:wq
SQL> @/export/home/oracle/plsql/test
SQL> @파일명 -> 실행결과만 나온다.
SQL> RUN 파일명 -> 프로시저의 내용과 결과가 같이 나온다.
[예제3] 함수 작성하기
- PL/SQL을 사용하여 Stored 함수와 Stored 프로시저를 작성한다. 방금까지 작성했던 코드를 Stored 함수로 캡슐화 시키면 그것을 한번만 컴파일하고 데이터베이스에 저장해 놓았다가 나중에 다시 사용할 수 있다.
- DB내에 stored 함수를 만들어 놓으면 나중엔 그 함수만 불러다 쓰면 된다.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CREATE OR REPLACE FUNCTION TEST_FUNC
RETURN NUMBER AS
x NUMBER;
BEGIN
x := 100;
RETURN x;
END;
/
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- OR REPLACE 는 동일한 함수가 존재하면 덮어쓰라는 의미이다.
- 1~2줄 CREATE 부터 AS 까지가 DECLARE 부분이다.
- 함수를 생성하는 것은 오라클이고 SQL*Plus는 결과만 보여줄 뿐이다.
[결과 확인]
- 함수를 작성하고 컴파일을 하였으니 이제 사용만 하면 된다. 함수이지만 ( )를 사용하지 않는 이유는 인수가 없기 때문.
SQL> SELECT TEST_FUNC FROM DUAL;
- 함수 생성시 STATUS가 INVALID 로 되어 있어 사용할 수 없기 때문에 코드에 잘못된 부분이 있는지 확인하고 수정 후 VALID 상태로 변경해야 한다. 오래 사용하지 않는 함수나 프로시저, 패키지도 INVALID 상태가 될 수 있다.
'Database / Sql' 카테고리의 다른 글
[Oracle] PL/SQL - 프로시저 (Procedure) (0) | 2012.11.05 |
---|---|
[Oracle] PL/SQL - 블럭 구조 (0) | 2012.10.31 |
[Oracle] JOIN DELETE (0) | 2012.07.21 |
[Oracle] Windows 2008 R2 64bit 에서 Oracle ODBC 설정 (0) | 2012.07.11 |
[Oracle] Windows 64bit 오라클 Client 설치 (0) | 2012.07.11 |