PL/SQL

PL/SQL(피엘에스큐엘)은 상용 관계형 데이터베이스 시스템인 오라클 DBMS에서 SQL 언어를 확장하기 위해 사용하는 컴퓨터 프로그래밍 언어 중 하나이다. PL/SQL은 오라클 데이터베이스의 경우 버전 7부터, 타임스텐 인메모리 데이터베이스의 경우 버전 11.2.1부터, IBM DB2의 경우 버전 9.7부터 사용할 수 있다.
특징.
주로 자료 내부에서 SQL 명령문만으로 처리하기에는 복잡한 자료의 저장이나 프로시저와 트리거 등을 작성하는 데 쓰인다. PL/SQL의 구조는 에이다 프로그래밍 언어를 본떠 만들어졌다고 알려졌다. 따라서 두 언어는 그 구조가 범용 언어인 파스칼의 구문과 비슷하다. 범용 언어인 C와 C++ 그리고 파스칼 및 포트란 등의 프로그래밍 언어와는 다른 점으로 범용 언어들이 컴퓨터 시스템에서 특정한 작업을 처리하기 위해 만들어진 언어라고 볼 때 PL/SQL은 단지 오라클의 관계형 데이터베이스 (RDBMS)에서만 사용된다는 점이다.
PL/SQL 외에도 각 관계형 데이터베이스마다 확장 언어들이 있다. 이러한 확장 언어의 대표적인 예로 마이크로소프트의 마이크로소프트 SQL 서버와 SybaseASE에는 트랜잭트 SQL(Transact SQ; TSQL)이 있고 PostgreSQL에는 PL/pgSQL 마지막으로 IBM DB2는 ISO SQL의 SQL/PSM 표준을 따르는 SQL Procedural를 포함한다.
PL/SQL 프로그램 단위.
PL/SQL 프로그램 단위는 다음 중 하나이다:
자료형.
PL/SQL의 주요 자료형은 NUMBER, CHAR, VARCHAR2, DATE, TIMESTAMP가 있다.
수치 변수.
variable_name number([P, S]) := 0;
문자 변수.
variable_name varchar2(20) := 'Text';
날짜 변수.
variable_name date := to_date('01-01-2005 14:20:23', 'DD-MM-YYYY hh24:mi:ss');
예외.
코드 실행 중의 오류인 예외는 두 종류가 있다: 사용자 정의 예외, 미리 정의된 예외.
RAISE &lt;exception name&gt;;
특정 열을 위한 자료형.
Variable_name Table_name.Column_name%type;
이 문법은 참조 테이블 상의 참조 컬럼의 종류의 변수를 정의한다:
 type data_type is record (field_1 type_1 := xyz, field_2 type_2 := xyz, ..., field_n type_n := xyz);
예를 들어 다음과 같다:
declare
 type t_address is record (
 name address.name%type,
 street address.street%type,
 street_number address.street_number%type,
 postcode address.postcode%type);
 v_address t_address;
begin
 select name, street, street_number, postcode into v_address from address where rownum = 1;
end;
조건문.
다음의 코드 부분은 IF-THEN-ELSIF 구조이다.
IF x = 1 THEN
 sequence_of_statements_1;
ELSIF x = 2 THEN
 sequence_of_statements_2;
ELSIF x = 3 THEN
 sequence_of_statements_3;
ELSIF x = 4 THEN
 sequence_of_statements_4;
ELSIF x = 5 THEN
 sequence_of_statements_5;
ELSE
 sequence_of_statements_N;
END IF;
CASE 문을 사용하면 일부 커다란 IF-THEN-ELSE 구조를 단순하게 만들 수 있다.
CASE
 WHEN x = 1 THEN sequence_of_statements_1;
 WHEN x = 2 THEN sequence_of_statements_2;
 WHEN x = 3 THEN sequence_of_statements_3;
 WHEN x = 4 THEN sequence_of_statements_4;
 WHEN x = 5 THEN sequence_of_statements_5;
 ELSE sequence_of_statements_N;
END CASE;
CASE 문은 미리 정의된 선택자와 함께 사용할 수 있다:
CASE x
 WHEN 1 THEN sequence_of_statements_1;
 WHEN 2 THEN sequence_of_statements_2;
 WHEN 3 THEN sequence_of_statements_3;
 WHEN 4 THEN sequence_of_statements_4;
 WHEN 5 THEN sequence_of_statements_5;
 ELSE sequence_of_statements_N;
END CASE;
배열 처리.
PL/SQL은 배열을 "컬렉션"(collection)으로 부른다. 이 언어는 세 가지 종류의 컬렉션을 제공한다:
커서.
커서는 DML 문(INSERT, UPDATE, DELETE 또는 MERGE)이나 SELECT 문으로부터의 정보가 저장된 사유(private) SQL 영역의 포인터이자 매커니즘이다.
루프.
LOOP 문.
«parent_loop»
LOOP
 statements
 «child_loop»
 loop
 statements
 exit parent_loop when &lt;condition&gt;; -- Terminates both loops
 exit when &lt;condition&gt;; -- Returns control to parent_loop
 end loop child_loop;
 if &lt;condition&gt; then
 continue; -- continue to next iteration
 end if;
 exit when &lt;condition&gt;;
END LOOP parent_loop;
FOR 루프.
declare
 var number;
begin
 /*N.B. for loop variables in pl/sql are new declarations, with scope only inside the loop */
 for var in 0 .. 10 loop
 dbms_output.put_line(var);
 end loop;
 if (var is null) then
 dbms_output.put_line('var is null');
 else
 dbms_output.put_line('var is not null');
 end if;
end;
결과:
 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 var is null
커서 FOR 루프.
FOR RecordIndex IN (SELECT person_code FROM people_table)
LOOP
 DBMS_OUTPUT.PUT_LINE(RecordIndex.person_code);
END LOOP;
예제.
다음은 PL/SQL로 구현한 오라클 저장 프로시저의 예이다.
CREATE OR REPLACE PROCEDURE helloworld (str IN VARCHAR2)
 AS
 hw VARCHAR2 (100) : = 'Hello World!';
 BEGIN
 DBMS_OUTPUT. PUT_LINE ( 'Hello World!');
 DBMS_OUTPUT. PUT_LINE ( 'VARIABLE hw ='| | hw);
 DBMS_OUTPUT. PUT_LINE ( 'Parameter str ='| | str);
 END;