PL/SQL
PL/SQL![]() |
PL/SQL(Procedural Language for SQL)은 Oracle Corporation의 SQL 및 Oracle 관계형 데이터베이스용 절차 확장입니다.PL/SQL은 Oracle Database(버전 7 이후 저장된 PL/SQL 프로시저/기능/패키지/트리거), Times Ten 인메모리 데이터베이스(버전 11.2.1 이후) 및 IBM DB2(9.[1]7 이후)에서 사용할 수 있습니다.Oracle Corporation은 일반적으로 Oracle Database의 후속 릴리스마다 PL/SQL 기능을 확장합니다.
PL/SQL에는 조건 및 루프와 같은 절차 언어 요소가 포함됩니다.이를 통해 상수와 변수, 절차와 함수, 유형 및 변수, 트리거를 선언할 수 있습니다.예외(실행시 오류)를 처리할 수 있습니다.어레이는 PL/SQL 컬렉션을 사용하여 지원됩니다.Oracle Database 버전 8 이후 구현에는 객체 지향과 관련된 기능이 포함되어 있습니다.프로시저, 함수, 패키지, 유형, 트리거 등의 PL/SQL 유닛을 생성할 수 있습니다.이 유닛은 Oracle Database 프로그래밍 인터페이스를 사용하는 응용 프로그램에서 재사용할 수 있도록 데이터베이스에 저장됩니다.
역사적으로 PL/SQL 정의의[2] 첫 번째 공개 버전은 1995년이었고 Oracle의 시작 연도 ~ 1992년입니다.ISO SQL/[3]PSM 표준을 구현합니다.
PL/SQL 프로그램 단위
SQL(비절차적)의 주요 특징도 SQL의 단점입니다. SQL만 사용해야 하는 경우에는 control 문(의사결정 또는 반복 제어)을 사용할 수 없습니다.PL/SQL은 기본적으로 절차 언어이며 의사 결정, 반복 및 다른 절차 프로그래밍 언어처럼 많은 기능을 제공합니다.PL/SQL 프로그램 유닛은 PL/SQL 익명 블록, 프로시저, 함수, 패키지 사양, 패키지 본문, 트리거, 유형 사양, 유형 본문, 라이브러리 중 하나입니다.프로그램 유닛은 데이터베이스 [4]상에서 컴파일, 개발 및 최종적으로 실행되는 PL/SQL 소스 코드입니다.
PL/SQL 익명 블록
PL/SQL 소스 프로그램의 기본 단위는 블록이며, 블록은 관련된 선언과 문을 함께 그룹화합니다.PL/SQL 블록은 DECLARE, BEGIN, EXCEPTION 및 END 키워드로 정의됩니다.이러한 키워드는 블록을 선언적 부분, 실행 가능한 부분 및 예외 처리 부분으로 나눕니다.선언 섹션은 옵션이며 상수 및 변수를 정의 및 초기화하는 데 사용할 수 있습니다.변수가 초기화되지 않은 경우 기본값은 NULL 값입니다.옵션 예외 처리 부분은 런타임 오류를 처리하는 데 사용됩니다.실행 가능한 부분만 필요합니다.블록에 라벨을 [5]붙일 수 있습니다.
예를 들어 다음과 같습니다.
<<라벨>> -- 이것은 옵션입니다. 선언하다 -- 이 섹션은 옵션입니다. 넘버 1 번호(2); 넘버 2 넘버 1%타입 := 17; --값 기본값 텍스트 1 VARCHAR2(12) := '헬로 월드'; 텍스트 2 날짜. := 시스템 날짜; -- 현재 날짜와 시각 시작한다. -- 이 섹션은 필수이며 적어도1개의 실행 가능한 스테이트먼트를 포함해야 합니다. 선택한다. street_number 안으로 넘버 1 부터 주소. 어디에 이름. = 'INU'; 예외. -- 이 섹션은 옵션입니다. 언제 다른이들 그리고나서 DBMS_OUTPUT.퍼트_라인('에러 코드는' 행선지(sql코드)); DBMS_OUTPUT.퍼트_라인('에러 메시지는' squalerrm); 끝.;
기호:=
는 변수에 값을 저장하는 할당 연산자로 기능합니다.
블록은 네스트할 수 있습니다.즉, 블록은 실행 가능한 스테이트먼트이기 때문에 실행 가능한 스테이트먼트가 허용되는 다른 블록에 표시될 수 있습니다.블록은 인터랙티브 툴(SQL*Plus 등)에 제출하거나 Oracle Precompiler 또는 OCI 프로그램에 삽입할 수 있습니다.인터랙티브 도구 또는 프로그램은 블록을 한 번 실행합니다.블록은 데이터베이스에 저장되지 않으므로 익명 블록이라고 합니다(라벨이 있는 경우에도).
기능.
일반적으로 PL/SQL 함수의 목적은 단일 값을 계산하고 반환하는 데 사용됩니다.이 반환되는 값은 단일 스칼라 값(숫자, 날짜, 문자열 등) 또는 단일 컬렉션(네스트된 테이블 또는 배열 등)일 수 있습니다.사용자 정의 함수는 Oracle [6]Corporation에서 제공하는 내장 함수를 보완합니다.
PL/SQL 함수의 형식은 다음과 같습니다.
만들다 또는 교체하다 기능. < >기능 n_n ame> [(입력/산출량 변수 선언.)] 돌아가다 return_type(반환형) [AUTHID < >현재_사용자 정의자>] < >IS ~하듯이> -- 표제 부분 양 번호; -- 선언 블록 시작한다. -- 실행 가능한 부품 < >PL/SQL 블록 와 함께 돌아가다 진술> 돌아가다 < >return_value>; [예외. 없음.] 돌아가다 < >return_value>; 끝.;
파이프라인 테이블 함수는 컬렉션을 반환하고[7] 다음 형식을 취합니다.
만들다 또는 교체하다 기능. < >기능 n_n ame> [(입력/산출량 변수 선언.)] 돌아가다 return_type(반환형) [AUTHID < >현재_사용자 정의자>] [< >집약 파이프라인>] < >IS 사용.> [선언. 블록] 시작한다. < >PL/SQL 블록 와 함께 돌아가다 진술> 파이프 배를 젓다 < >돌아가다 유형>; 돌아가다; [예외. 예외. 블록] 파이프 배를 젓다 < >돌아가다 유형>; 돌아가다; 끝.;
함수는 기본 IN 유형의 매개 변수만 사용해야 합니다.함수의 출력 값은 함수가 반환하는 값뿐이어야 합니다.
절차.
절차는 반복적으로 호출할 수 있는 프로그램 단위로 명명된다는 점에서 기능과 유사합니다.주요 차이점은 함수는 SQL 문에서 사용할 수 있지만 프로시저는 사용할 수 없다는 것입니다.또 다른 차이점은 프로시저가 여러 값을 반환할 수 있는 반면 함수는 하나의 [8]값만 반환해야 한다는 것입니다.
절차는 절차 이름을 유지하는 필수 머리글 부분과 선택적으로 절차 매개 변수 목록으로 시작합니다.다음으로 PL/SQL Anonymous Block과 같이 선언적, 실행 가능 및 예외 처리 부분이 나옵니다.간단한 순서는 다음과 같습니다.
만들다 절차. create_email_address ( -- 절차 제목 부분이 시작됩니다. 이름 1 VARCHAR2, 이름 2 VARCHAR2, 회사 VARCHAR2, 이메일 나가. VARCHAR2 ) -- 절차 제목 부분 종료 ~하듯이 -- 선언 부분이 시작됩니다(옵션). error_message VARCHAR2(30) := '이메일 주소가 너무 깁니다.'; 시작한다. -- 실행 가능한 부품이 시작됩니다(필수). 이메일 := 이름 1 '.' 이름 2 '@' 회사; 예외. -- 예외 처리 부품이 시작됩니다(옵션). 언제 값_ERROR 그리고나서 DBMS_OUTPUT.퍼트_라인(error_message); 끝. create_email_address;
위의 예는 스탠드아론 프로시저를 나타내고 있습니다.이러한 프로시저는 CREATE PROCEDURE 문을 사용하여 작성 및 데이터베이스 스키마에 저장됩니다.PL/SQL 패키지에 프로시저를 작성할 수도 있습니다.이것을 패키지 프로시저라고 부릅니다.PL/SQL 익명 블록에서 작성된 프로시저를 중첩 프로시저라고 합니다.데이터베이스에 저장된 독립 실행형 또는 패키지 프로시저를 "저장된 프로시저"라고 합니다.
절차에는 IN, OUT 및 IN OUT의 세 가지 유형의 파라미터가 있습니다.
- IN 파라미터는 입력으로만 사용됩니다.IN 파라미터는 참조에 의해 전달되지만 비활성 프로그램에 의해 변경될 수 있습니다.
- OUT 파라미터는 처음에 NULL입니다.프로그램에 의해 파라미터 값이 할당되고 그 값이 호출 프로그램으로 반환됩니다.
- IN OUT 파라미터에는 초기값이 있을 수도 있고 없을 수도 있습니다.이 초기값은 호출된 프로그램에 의해 변경될 수도 있고 변경되지 않을 수도 있습니다.파라미터의 변경은 기본적으로 복사하여 호출 프로그램으로 반환되지만 NO-COPY 힌트를 사용하여 참조로 전달될 수 있습니다.
또한 PL/SQL은 Oracle 데이터베이스 표준을 통해 외부 프로시저를 지원합니다.ext-proc
과정.[9]
패키지
패키지는 개념적으로 연결된 함수, 절차, 변수, PL/SQL 테이블 및 레코드 TYPE 문, 상수, 커서 등의 그룹입니다.패키지를 사용하면 코드 재사용이 촉진됩니다.패키지는 패키지 사양과 옵션 패키지 본문으로 구성됩니다.사양은 응용 프로그램에 대한 인터페이스로, 사용 가능한 유형, 변수, 상수, 예외, 커서 및 하위 프로그램을 선언합니다.본문은 커서와 하위 프로그램을 완전히 정의하므로 사양을 구현합니다.패키지의 장점은 다음 두 가지입니다.[10]
- 모듈러형 어프로치, 비즈니스 로직의 캡슐화/숨김, 보안, 퍼포먼스 향상, 재사용성.이들은 함수 오버로드 및 캡슐화와 같은 객체 지향 프로그래밍 기능을 지원합니다.
- 패키지 사양에서 선언된 변수가 세션 범위를 가지므로 패키지 변수를 사용하면 세션 수준(범위) 변수를 선언할 수 있습니다.
트리거
데이터베이스 트리거는 지정된 이벤트가 발생할 때마다 Oracle Database가 자동으로 호출하는 저장 프로시저와 같습니다.데이터베이스에 저장되어 반복 호출이 가능한 이름 있는 PL/SQL 장치입니다.저장 프로시저와 달리 트리거를 활성화 및 비활성화할 수 있지만 명시적으로 호출할 수는 없습니다.트리거가 네이블로 되어 있는 동안 트리거 이벤트가 발생할 때마다 데이터베이스는 트리거를 자동으로 호출합니다.트리거가 비활성화되어 있는 동안에는 트리거가 실행되지 않습니다.
트리거는 CREATE TRIGGER 문을 사용하여 생성합니다.트리거하는 문과 해당 문장이 작동하는 항목을 기준으로 트리거 이벤트를 지정합니다.트리거는 항목(테이블, 뷰, 스키마 또는 데이터베이스)에 생성되거나 정의된다고 합니다.타이밍 포인트도 지정합니다.이 타이밍 포인트는 트리거가 트리거 스테이트먼트가 실행되기 전인지 실행 후에 발생하는지 및 트리거 스테이트먼트가 영향을 주는 각 행에 대해 트리거가 발생하는지 여부를 결정합니다.
테이블 또는 뷰에서 트리거가 생성된 경우 트리거 이벤트는 DML 문으로 구성되며 트리거를 DML 트리거라고 합니다.스키마 또는 데이터베이스에 트리거가 생성되면 트리거 이벤트는 DDL 또는 데이터베이스 동작문으로 구성되며 트리거는 시스템트리거라고 불립니다
트리거는 뷰에서 생성된 DML 트리거 또는 CREATE 문에 정의된 시스템 트리거 중 하나입니다.데이터베이스는 트리거 문을 실행하는 대신 트리거를 실행합니다.
트리거의 목적
트리거는 다음과 같은 목적으로 쓸 수 있습니다.
- 일부 파생 열 값 자동 생성
- 참조 무결성 적용
- 이벤트 기록 및 테이블 액세스 정보 저장
- 감사
- 테이블의 동기 리플리케이션
- 보안 인가 적용
- 잘못된 트랜잭션 방지
데이터형
PL/SQL의 주요 데이터 유형에는 NUMBER, CHAR, VARCHAR2, DATE 및 TIMESTAMP가 있습니다.
숫자 변수
variable_name 번호([P, S]) := 0;
숫자 변수를 정의하기 위해 프로그래머는 변수 유형 NUMBER을 이름 정의에 추가합니다.(옵션) 정밀도(P)와 (옵션) 스케일(S)을 지정하려면 이들을 쉼표로 구분하여 둥근 괄호 안에 추가합니다.("이 컨텍스트에서 Precision"은 변수를 유지할 수 있는 자릿수, "scale"은 소수점 뒤에 올 수 있는 자릿수를 의미합니다.
숫자 변수에는 binary_float, binary_double, dec, dec, dec, double precision, float, int, numeric, real, small-int, binary_integer 등이 있습니다.
문자 변수
variable_name 바샤르2(20) := '텍스트'; -- 예: 주소. 바샤르2(20) := '호수 뷰 도로';
문자 변수를 정의하기 위해 프로그래머는 보통 변수 유형 VARCHAR2를 이름 정의에 추가합니다.괄호 안에 변수가 저장할 수 있는 최대 문자 수를 나타냅니다.
문자 변수의 기타 데이터 유형에는 varchar, char, long, raw, long raw, nchar, nchar2, clob, blob 및 bfile이 있습니다.
날짜 변수
variable_name 날짜. := 종료일('01-01-2005 14:20:23', 'DD-MM-YYY hh24:mi:ss');
날짜 변수에는 날짜와 시간을 포함할 수 있습니다.시간은 생략할 수 있지만 시간만 포함하는 변수를 정의하는 방법은 없습니다.DATETIME 유형은 없습니다.그리고 TIME 타입도 있어요.단, 최대 밀리초 또는 나노초의 세밀한 타임스탬프를 포함할 수 있는 TIMESTAMP 타입은 없습니다.그TO_DATE
함수를 사용하여 문자열을 날짜 값으로 변환할 수 있습니다.함수는 첫 번째 따옴표로 묶인 문자열을 정의로 사용하여 날짜로 변환합니다.다음은 예를 제시하겠습니다.
종료일('31-12-2004', 'dd-mm-yyy')
또는
종료일 ('2004년 12월 31일', 'dd-mon-yyy', 'NLS_DATE_LANGUAGE = 미국')
날짜를 문자열로 변환하려면 함수를 사용합니다.TO_CHAR (date_string, format_string)
.
PL/SQL은 ANSI 날짜 및 간격 리터럴 [11]사용도 지원합니다.다음 절은 18개월 범위를 제공합니다.
어디에 날짜 필드 사이에 날짜. '2004-12-30' - 간격 '1-6' 연도 로. 달 그리고. 날짜. '2004-12-30'
예외
예외(코드 실행 중 오류)는 사용자 정의와 사전 정의의 두 가지 유형입니다.
사용자 정의 예외는 항상 프로그래머에 의해 명시적으로 발생합니다.RAISE
또는RAISE_APPLICATION_ERROR
정상적인 실행을 계속할 수 없다고 판단되는 모든 상황에서 명령어를 사용합니다.그RAISE
명령어 구문은 다음과 같습니다.
올리다 < >예외. 이름.>;
Oracle Corporation은 다음과 같은 몇 가지 예외를 미리 정의했습니다.NO_DATA_FOUND
,TOO_MANY_ROWS
각 예외에는 SQL 오류 번호와 SQL 오류 메시지가 관련되어 있습니다.프로그래머는 다음 명령어를 사용하여 이 명령어에 액세스할 수 있습니다.SQLCODE
그리고.SQLERRM
기능들.
특정 열에 대한 데이터 유형
Variable_name Table_name 입니다.Column_name%type;
이 구문은 참조된 테이블에서 참조된 열 유형의 변수를 정의합니다.
프로그래머는 다음 구문을 사용하여 사용자 정의 데이터 유형을 지정합니다.
유형 data_type 이 기록. (필드_1 타입_1 := xyz, 필드_2 type_2 := xyz, ..., 필드_n type_n := xyz);
예를 들어 다음과 같습니다.
선언하다 유형 t_address 이 기록. ( 이름. 주소..이름.%type, 거리 주소..거리%type, street_number 주소..street_number%type, 우편번호 주소..우편번호%type); v_address t_address; 시작한다. 선택한다. 이름., 거리, street_number, 우편번호 안으로 v_address 부터 주소. 어디에 로넘 = 1; 끝.;
이 샘플 프로그램은 t_address라는 자체 데이터 유형을 정의합니다.이 데이터 유형에는 필드 이름, 거리, street_number 및 우편 번호가 포함됩니다.
이 예에 따르면 데이터베이스의 데이터를 프로그램의 필드에 복사할 수 있습니다.
프로그래머는 이 데이터형을 사용하여 v_address라는 변수를 정의하고 ADDRESS 테이블에서 데이터를 로드합니다.
프로그래머는 닷 표기를 사용하여 이러한 구조에서 개별 속성을 지정할 수 있습니다. 따라서 다음과 같습니다.
v_address.street : = '하이 스트리트';
조건문
다음 코드 세그먼트는 IF-THEN-ELSIF-ELSE 구조를 나타냅니다.ELSIF 및 ELSE 부품은 옵션이므로 보다 단순한 IF-THEN 또는 IF-THEN-ELSE 구조를 만들 수 있습니다.
한다면 x = 1 그리고나서 sequence_of_statements_1; ELSIF x = 2 그리고나서 sequence_of_statements_2; ELSIF x = 3 그리고나서 sequence_of_statements_3; ELSIF x = 4 그리고나서 sequence_of_statements_4; ELSIF x = 5 그리고나서 sequence_of_statements_5; 또 다른 sequence_of_statements_n; 끝. 한다면;
CASE 스테이트먼트는, 몇개의 큰 IF-THEN-ELSIF-ELSE 구조를 간략화합니다.
사례. 언제 x = 1 그리고나서 sequence_of_statements_1; 언제 x = 2 그리고나서 sequence_of_statements_2; 언제 x = 3 그리고나서 sequence_of_statements_3; 언제 x = 4 그리고나서 sequence_of_statements_4; 언제 x = 5 그리고나서 sequence_of_statements_5; 또 다른 sequence_of_statements_n; 끝. 사례.;
CASE 문은 사전 정의된 셀렉터와 함께 사용할 수 있습니다.
사례. x 언제 1 그리고나서 sequence_of_statements_1; 언제 2 그리고나서 sequence_of_statements_2; 언제 3 그리고나서 sequence_of_statements_3; 언제 4 그리고나서 sequence_of_statements_4; 언제 5 그리고나서 sequence_of_statements_5; 또 다른 sequence_of_statements_n; 끝. 사례.;
어레이 처리
PL/SQL은 어레이를 "컬렉션"이라고 부릅니다.이 언어에는 다음 세 가지 유형의 컬렉션이 있습니다.
- 연관 배열(인덱스 기준 테이블)
- 중첩된 테이블
- Varray(Variable-Size Array)
프로그래머는 변수 상한을 지정해야 하지만 인덱스 기준 테이블이나 중첩된 테이블에 대해서는 지정할 필요가 없습니다.언어에는 FIRST, LAST, NEXT, PREAR, EXTEND, TRIM, DELETE 등 수집 요소를 조작하는 데 사용되는 여러 수집 방법이 있습니다.PL/SQL의 Ackermann 함수에 대한 메모 함수의 예시와 같이 인덱스 기준 테이블을 사용하여 연관 배열을 시뮬레이션할 수 있습니다.
연관 배열(인덱스 기준 테이블)
인덱스 기준 테이블에서는 어레이를 숫자 또는 문자열로 인덱싱할 수 있습니다.키와 값의 쌍으로 구성된 Java 맵과 평행합니다.차원은 하나뿐이고 무한합니다.
중첩된 테이블
중첩된 표를 사용하면 프로그래머는 중첩된 내용을 이해해야 합니다.여기에서는 새로운 타입이 작성되어 다수의 컴포넌트로 구성될 수 있습니다.그런 다음 이 유형을 사용하여 테이블에 열을 만들 수 있으며, 이 열에 중첩된 구성요소가 됩니다.
Varray(Variable-Size Array)
Varray의 경우 "가변 크기 배열"이라는 문구의 "가변수"라는 단어는 예상대로 배열 크기에 적용되지 않는다는 것을 이해해야 합니다.어레이가 선언하는 사이즈는 사실상 고정되어 있습니다.배열의 요소 수는 선언된 크기까지 가변적입니다.따라서 가변 크기 어레이는 크기가 그다지 다양하지 않습니다.
커서
커서는 SELECT 또는 Data Manipulation Language(DML; 데이터 조작 언어) 문(INSERT, UPDATE, DELETE 또는 MERGE)에서 가져온 정보를 저장하는 개인 SQL 영역에 대한 포인터입니다.커서는 SQL 문에 의해 반환된 행(1개 이상)을 유지합니다.커서가 유지하는 행 집합을 활성 [12]집합이라고 합니다.
커서는 명시적일 수도 있고 암시적일 수도 있습니다.FOR 루프에서는 쿼리를 재사용할 경우 명시적 커서가 사용되어야 하며, 그렇지 않을 경우 암묵적 커서가 선호됩니다.루프 내에서 커서를 사용하는 경우 일괄 수집이 필요한 경우 또는 동적 SQL이 필요한 경우 FETCH를 사용하는 것이 좋습니다.
루프
정의상 절차 언어로서 PL/SQL은 기본 LOUP 문, WHI 루프, FOR 루프 및 커서 FOR 루프를 포함한 여러 반복 구조를 제공합니다.Oracle 7.3부터 REF 커서 유형이 도입되어 저장 프로시저 및 함수에서 레코드 세트를 반환할 수 있게 되었습니다.Oracle 9i에서는 사전 정의된 SYS_REFCURSOR 유형이 도입되었습니다.즉, 더 이상 자체 REF 커서 유형을 정의할 필요가 없습니다.
LOUP 문
<< parent_loop >> 고리 진술들 << child _ loop >> 고리 진술들 퇴장 parent_loop 언제 < >조건.>; -- 양쪽 루프를 종료합니다. 퇴장 언제 < >조건.>; -- 제어를 parent_loop으로 되돌립니다. 끝. 고리 child_loop; 한다면 < >조건.> 그리고나서 계속하다.; -- 다음 반복으로 넘어갑니다. 끝. 한다면; 퇴장 언제 < >조건.>; 끝. 고리 parent_loop;
루프는 를 사용하여 종료할 수 있습니다.EXIT
키워드를 지정하거나 예외를 발생시킵니다.
FOR 루프
선언하다 변화하다 번호; 시작한다. /* PL/SQL의 루프 변수에 대한 N.B.는 루프 내부에만 스코프가 있는 새로운 선언입니다 */ 위해서 변화하다 입력 0 .. 10 고리 DBMS_OUTPUT.퍼트_라인(변화하다); 끝. 고리; 한다면 변화하다 IS 특수한 순서 그리고나서 DBMS_OUTPUT.퍼트_라인('var is null'); 또 다른 DBMS_OUTPUT.퍼트_라인('var는 null이 아닙니다'); 끝. 한다면; 끝.;
출력:
0 1 2 3 4 5 6 7 8 9 var는 null입니다.
커서 FOR 루프
위해서 레코드 인덱스 입력 (선택한다. 퍼스널 코드 부터 피플_테이블) 고리 DBMS_OUTPUT.퍼트_라인(레코드 인덱스.퍼스널 코드); 끝. 고리;
Cursor-for loops는 자동으로 커서를 열고 해당 데이터를 읽은 후 다시 커서를 다시 닫습니다.
대안으로, PL/SQL 프로그래머는 커서의 SELECT-스테이트먼트를 미리 정의하여 재사용을 허용하거나 코드를 이해하기 쉽게 만들 수 있습니다(길거나 복잡한 쿼리의 경우 특히 유용합니다).
선언하다 커서 커서_사람 IS 선택한다. 퍼스널 코드 부터 피플_테이블; 시작한다. 위해서 레코드 인덱스 입력 커서_사람 고리 DBMS_OUTPUT.퍼트_라인(레코드 인덱스.퍼스널 코드); 끝. 고리; 끝.;
FOR 루프 내의 person_code의 개념은 닷 표기("")로 표현됩니다.
레코드 인덱스.퍼스널 코드
동적 SQL
프로그래머는 간단한 SQL 문을 사용하여 DML(Data Manipulation Language) 문을 PL/SQL 코드에 직접 삽입할 수 있지만 DDL(Data Definition Language)에서는 PL/SQL 코드에 보다 복잡한 "Dynamic SQL" 문이 필요합니다.그러나 DML 문은 일반적인 소프트웨어 애플리케이션에서 PL/SQL 코드의 대부분을 뒷받침합니다.
PL/SQL 다이내믹 SQL의 경우 이전 버전의 Oracle Database에서는 복잡한 Oracle을 사용해야 했습니다.DBMS_SQL
패키지 라이브러리그러나 최신 버전에서는 더 단순한 "네이티브 다이내믹 SQL"과 관련지어져 있습니다.EXECUTE IMMEDIATE
구문을 사용합니다.
유사 언어
PL/SQL은 다른 관계형 데이터베이스와 관련된 삽입 프로시저 언어와 유사하게 작동합니다.예를 들어 Sybase ASE 및 Microsoft SQL Server에는 Transact-SQL, Postgre가 있습니다.SQL에는 PL/PG SQL(PL/SQL을 어느 정도 에뮬레이트), MariaDB에는 PL/SQL 호환성 파서가,[14] IBM DB2에는 ISO SQL의 SQL/PSM 표준을 준수하는 SQL Procedural [15]Language가 포함되어 있습니다.
PL/SQL의 설계자는 Ada의 구문을 본떠 구문을 모델링했습니다.Ada와 PL/SQL은 모두 Pascal을 공통 조상으로 가지고 있기 때문에 PL/SQL도 대부분의 면에서 Pascal과 유사합니다.그러나 PL/SQL 패키지의 구조는 Borland Delphi 또는 Free Pascal 유닛에 의해 구현된 기본적인 Object Pascal 프로그램 구조와 유사하지 않습니다.프로그래머는 PL/SQL [16]패키지에 퍼블릭 및 프라이빗 글로벌 데이터 유형, 상수 및 정적 변수를 정의할 수 있습니다.
또한 PL/SQL에서는 클래스를 정의하고 PL/SQL 코드에서 개체로 인스턴스화할 수 있습니다.이것은 오브젝트 파스칼, C++, 자바와 같은 오브젝트 지향 프로그래밍 언어에서의 사용법과 유사합니다.PL/SQL은 클래스를 ADT(Abstract Data Type) 또는 UDT(User Defined Type)라고 하며 PL/SQL 사용자 정의 유형이 아닌 Oracle SQL 데이터 유형으로 정의하므로 Oracle SQL Engine과 Oracle PL/SQL 엔진 모두에서 사용할 수 있습니다.Abstract Data Type의 생성자 및 메서드는 PL/SQL로 작성됩니다.결과 추상 데이터 유형은 PL/SQL에서 개체 클래스로 작동할 수 있습니다.이러한 개체는 Oracle 데이터베이스 테이블의 열 값으로 유지될 수도 있습니다.
PL/SQL은 표면적인 유사점에도 불구하고 기본적으로 Transact-SQL과 다릅니다.코드를 다른 언어로 이식하려면 보통 간단한 작업이 필요합니다.이는 두 [17]언어의 기능 세트가 다를 뿐만 아니라 Oracle과 SQL Server의 동시성 및 잠금 처리 방식이 매우 다르기 때문입니다.
StepSqlite 제품은 널리 사용되는 소규모 데이터베이스 SQLite용 PL/SQL 컴파일러로 PL/SQL 구문의 서브셋을 지원합니다.Oracle의 Berkeley DB 11g R2 릴리스는 Berkeley [18]DB에 SQLite 버전을 포함시킴으로써 널리 사용되는 SQLite API를 기반으로 SQL 지원을 추가했습니다.따라서 StepSqlite는 Berkeley [19]DB에서 PL/SQL 코드를 실행하기 위한 서드파티 툴로도 사용할 수 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Serge Rielau (srielau@ca.ibm.com), SQL Architect, STSM, IBM. "DB2 10: Run Oracle applications on DB2 10 for Linux, UNIX, and Windows". Ibm.com. Retrieved 2012-07-26.
{{cite web}}
: CS1 maint: 여러 이름: 작성자 목록(링크) - ^ Steven Feuerstein(1995), "Oracle PL/SQL 프로그래밍", 초판, 초판.
- ^ "Oracle Compliance with SQL/PSM".
- ^ "Oracle Server Features". Oracle. Retrieved 2020-09-21.
- ^ "PL/SQL Anonymous Blocks". Oracle. Retrieved 2020-09-21.
- ^ "Database SQL Reference". Oracle. Retrieved 2020-09-21.
- ^ Nanda, Arup; Feuerstein, Steven (2005). Oracle PL/SQL for DBAs. O'Reilly Series. O'Reilly Media, Inc. pp. 122, 429. ISBN 978-0-596-00587-0. Retrieved 2011-01-11.
A pipelined table function [...] returns a result set as a collection [...] iteratively. [... A]s each row is ready to be assigned to the collection, it is 'piped out' of the function.
- ^ "Database SQL Reference". Oracle. Retrieved 2020-09-21.
- ^ Gupta, Saurabh K. (2012). "5: Using Advanced Interface Methods". Advanced Oracle PL/SQL Developer's Guide. Professional experience distilled (2 ed.). Birmingham: Packt Publishing Ltd (published 2016). p. 143. ISBN 9781785282522. Retrieved 2017-06-08.
Whenever the PL/SQL runtime engine encounters an external procedure call, the Oracle Database starts the extproc process. The database passes on the information received from the call specification to the
extproc
process, which helps it to locate the external procedure within the library and execute it using the supplied parameters. Theextproc
process loads the dynamic linked library, executes the external procedure, and returns the result back to the database. - ^ "Coding PL/SQL Procedures and Packages". Oracle. Retrieved 2020-09-21.
- ^ "Literals". Oracle iSQL Reference 10g Release 2 (10.2). Oracle. Retrieved 2009-03-20.
- ^ Feuerstein, Steven. "Working with Cursors". oracle.com.
- ^ "Database PL/SQL User's Guide and Reference". download.oracle.com.
- ^ "What's New in MariaDB Server 10.3" (PDF). MariaDB. Retrieved 2018-08-21.
- ^ "SQL PL". Publib.boulder.ibm.com. Retrieved 2012-07-26.
- ^ Oracle 문서 "PL/SQL의 개인 및 공용 항목"
- ^ "Migrating from Oracle to SQL Server - T-SQL, PL/SQL differences: Narayana Vyas Kondreddi's home page". vyaskn.tripod.com.
- ^ Burd, Gregory (March 24, 2010). "@humanications We didn't re-implement the SQLite API, we include a version of SQLite which uses Berkeley DB for storage (replacing btree.c)".
- ^ "Official Berkeley DB FAQ". Oracle Corporation. Retrieved March 30, 2010.
Does Berkeley DB support PL/SQL?
추가 정보
- Feuerstein, Steven; Bill Pribyl (2014). Oracle PL/SQL Programming (6th ed.). O'Reilly & Associates. ISBN 978-1449324452.
- Naudé, Frank (June 9, 2005). "Oracle PL/SQL FAQ rev 2.08".
외부 링크
