{{위키데이터 속성 추적}}
{{출처 필요|날짜=2010-04-28}}
'''PL/SQL'''(피엘에스큐엘)은 상용 관계형 데이터베이스 시스템인 [[오라클 데이터베이스|오라클 DBMS]]에서 SQL 언어를 확장하기 위해 사용하는 컴퓨터 프로그래밍 언어 중 하나이다. PL/SQL은 오라클 데이터베이스의 경우 버전 7부터, [[타임스텐|타임스텐 인메모리 데이터베이스]]의 경우 버전 11.2.1부터, [[IBM DB2]]의 경우 버전 9.7부터 사용할 수 있다.<ref>{{웹 인용|author=Serge Rielau (srielau@ca.ibm.com), SQL Architect, STSM, IBM |url=http://www.ibm.com/developerworks/data/library/techarticle/dm-0907oracleappsondb2/index.html |제목=DB2 10: Run Oracle applications on DB2 10 for Linux, UNIX, and Windows |publisher=Ibm.com |accessdate=2012-07-26}}</ref>

== 특징 ==
주로 자료 내부에서 SQL 명령문만으로 처리하기에는 복잡한 자료의 저장이나 프로시저와 트리거 등을 작성하는 데 쓰인다. PL/SQL의 구조는 [[에이다 (프로그래밍 언어)|에이다]] 프로그래밍 언어를 본떠 만들어졌다고 알려졌다. 따라서 두 언어는 그 구조가 범용 언어인 파스칼의 구문과 비슷하다. 범용 언어인 [[C (프로그래밍 언어)|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 익명 블록
* 함수
* 프로시저
* 패키지
** 패키지 사양
** 패키지 바디
* 트리거

== 자료형 ==
PL/SQL의 주요 자료형은 NUMBER, CHAR, VARCHAR2, DATE, TIMESTAMP가 있다.
=== 수치 변수 ===
<syntaxhighlight lang="PLSQL">variable_name number([P, S]) := 0;</syntaxhighlight>
=== 문자 변수 ===
<syntaxhighlight lang="PLSQL">variable_name varchar2(20) := 'Text';</syntaxhighlight>
=== 날짜 변수 ===
<syntaxhighlight lang="PLSQL">variable_name date := to_date('01-01-2005 14:20:23', 'DD-MM-YYYY hh24:mi:ss');</syntaxhighlight>
=== 예외 ===
코드 실행 중의 오류인 예외는 두 종류가 있다: 사용자 정의 예외, 미리 정의된 예외.
<syntaxhighlight lang="PLSQL">RAISE <exception name>;</syntaxhighlight>
=== 특정 열을 위한 자료형 ===
Variable_name <span style="color:#B8860B">Table_name</span><span style="color:#00f;">.</span>Column_name<span style="color:#00f;">%type;</span>

이 문법은 참조 테이블 상의 참조 컬럼의 종류의 변수를 정의한다:

 type data_type is record (field_1 type_1 := xyz, field_2 type_2 := xyz, ..., field_n type_n := xyz);

예를 들어 다음과 같다:

<syntaxhighlight lang="PLSQL">
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;
</syntaxhighlight>

== 조건문 ==
다음의 코드 부분은 IF-THEN-ELSIF 구조이다.

<syntaxhighlight lang="PLpgSQL">
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;
</syntaxhighlight>

CASE 문을 사용하면 일부 커다란 IF-THEN-ELSE 구조를 단순하게 만들 수 있다.

<syntaxhighlight lang="PLSQL">
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;
</syntaxhighlight>

CASE 문은 미리 정의된 선택자와 함께 사용할 수 있다:

<syntaxhighlight lang="PLSQL">
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;
</syntaxhighlight>

== 배열 처리 ==
PL/SQL은 배열을 "컬렉션"(collection)으로 부른다. 이 언어는 세 가지 종류의 컬렉션을 제공한다:
# 연관 배열
# 내재된 테이블(nested table)
# 배열 (변수 크기의 배열)

== 커서 ==
[[데이터베이스 커서|커서]]는 DML 문(INSERT, UPDATE, DELETE 또는 MERGE)이나 SELECT 문으로부터의 정보가 저장된 사유(private) SQL 영역의 포인터이자 매커니즘이다.

== 루프 ==
=== LOOP 문 ===
<syntaxhighlight lang="PLpgSQL">
<<parent_loop>>
LOOP
	statements

	<<child_loop>>
	loop
		statements
		exit parent_loop when <condition>; -- Terminates both loops
		exit when <condition>; -- Returns control to parent_loop
	end loop child_loop;
        if <condition> then
           continue; -- continue to next iteration
        end if;

	exit when <condition>;
END LOOP parent_loop;
</syntaxhighlight><ref>[http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/controlstructures.htm#sthref921 Syntax]</ref>

=== FOR 루프 ===
<syntaxhighlight lang="plpgsql">
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;
</syntaxhighlight>
결과:
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  var is null

=== 커서 FOR 루프 ===
<syntaxhighlight lang="plpgsql">
FOR RecordIndex IN (SELECT person_code FROM people_table)
LOOP
  DBMS_OUTPUT.PUT_LINE(RecordIndex.person_code);
END LOOP;
</syntaxhighlight>

== 예제 ==
다음은 PL/SQL로 구현한 오라클 [[저장 프로시저]]의 예이다.

<syntaxhighlight lang="plsql">
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;
  /
</syntaxhighlight>

== 같이 보기 ==
* [[SQL]]
* [[T-SQL]]
* [[SQL/PSM]]
* [[오라클 데이터베이스|오라클 DBMS]]
* [[관계형 데이터베이스]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* {{언어링크|en}} [https://web.archive.org/web/20070607144640/http://www.orafaq.com/faq/plsql Oracle FAQ: PL/SQL]
* {{언어링크|en}} [http://www.oracle.com/technology/tech/pl_sql/index.html Oracle Technology Center]
* {{언어링크|en}} [https://web.archive.org/web/20070601010744/http://www.paked.com/computing.htm PL/SQL - Loop Examples]

{{주요 프로그래밍 언어}}
{{전거 통제}}

[[분류:오라클 코퍼레이션]]
[[분류:SQL]]
[[분류:프로그래밍 언어]]
[[분류:데이터 관리]]
[[분류:오라클 소프트웨어]]
[[분류:데이터 중심 프로그래밍 언어]]