PL/SQL
이 문서의 내용은 출처가 분명하지 않습니다. (2010년 4월) |
PL/SQL(피엘에스큐엘)은 상용 관계형 데이터베이스 시스템인 오라클 DBMS에서 SQL 언어를 확장하기 위해 사용하는 컴퓨터 프로그래밍 언어 중 하나이다. PL/SQL은 오라클 데이터베이스의 경우 버전 7부터, 타임스텐 인메모리 데이터베이스의 경우 버전 11.2.1부터, IBM DB2의 경우 버전 9.7부터 사용할 수 있다.[1]
특징
주로 자료 내부에서 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 익명 블록
- 함수
- 프로시저
- 패키지
- 패키지 사양
- 패키지 바디
- 트리거
자료형
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 <exception name>;
특정 열을 위한 자료형
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)으로 부른다. 이 언어는 세 가지 종류의 컬렉션을 제공한다:
- 연관 배열
- 내재된 테이블(nested table)
- 배열 (변수 크기의 배열)
커서
커서는 DML 문(INSERT, UPDATE, DELETE 또는 MERGE)이나 SELECT 문으로부터의 정보가 저장된 사유(private) SQL 영역의 포인터이자 매커니즘이다.
루프
LOOP 문
<<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;
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;
/
같이 보기
각주
- ↑ Serge Rielau ([email protected]), SQL Architect, STSM, IBM. “DB2 10: Run Oracle applications on DB2 10 for Linux, UNIX, and Windows”. Ibm.com. 2012년 7월 26일에 확인함.
- ↑ Syntax
외부 링크
- (영어) Oracle FAQ: PL/SQL
- (영어) Oracle Technology Center
- (영어) PL/SQL - Loop Examples
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.