Oracle PL/SQL 패키지: 유형, 사양, 본문 [예]
패키지란 무엇입니까? Oracle?
PL/SQL 패키지는 관련 하위 프로그램(프로시저/함수)을 단일 요소로 논리적으로 그룹화한 것입니다. 패키지는 나중에 사용할 수 있는 데이터베이스 객체로 컴파일되어 저장됩니다.
패키지 구성요소
PL/SQL 패키지에는 두 가지 구성 요소가 있습니다.
- 패키지 사양
- 패키지 본체
패키지 사양
패키지 사양은 모든 공개 선언으로 구성됩니다. 변수, 커서, 개체, 프로시저, 함수 및 예외.
다음은 패키지 사양의 몇 가지 특징입니다.
- 명세에 선언된 모든 요소는 패키지 외부에서 접근이 가능합니다. 이러한 요소를 공용 요소라고 합니다.
- 패키지 사양은 패키지 본문 없이 단독으로 존재할 수 있음을 의미하는 독립형 요소입니다.
- 패키지가 참조될 때마다 해당 특정 세션에 대해 패키지 인스턴스가 생성됩니다.
- 세션에 대한 인스턴스가 생성된 후 해당 인스턴스에서 시작된 모든 패키지 요소는 세션이 끝날 때까지 유효합니다.
통사론
CREATE [OR REPLACE] PACKAGE <package_name> IS <sub_program and public element declaration> . . END <package name>
위 구문은 패키지 사양 생성을 보여줍니다.
패키지 본체
패키지 명세에 존재하는 모든 요소의 정의로 구성됩니다. 사양에 선언되지 않은 요소에 대한 정의도 있을 수 있습니다. 이러한 요소는 전용 요소라고 하며 패키지 내부에서만 호출할 수 있습니다.
다음은 Package Body의 특징입니다.
- 여기에는 모든 하위 프로그램에 대한 정의가 포함되어야 합니다.커서 사양에 선언된 내용입니다.
- 또한 사양에 선언되지 않은 더 많은 하위 프로그램이나 기타 요소가 있을 수도 있습니다. 이를 비공개 요소라고 합니다.
- 신뢰할 수 있는 개체이며 패키지 사양에 따라 다릅니다.
- 사양이 컴파일될 때마다 패키지 본문의 상태는 'Invalid'가 됩니다. 따라서 사양을 컴파일한 후에는 매번 다시 컴파일해야 합니다.
- 전용 요소는 패키지 본문에서 사용되기 전에 먼저 정의되어야 합니다.
- 패키지의 첫 번째 부분은 전역 선언 부분입니다. 여기에는 전체 패키지에 표시되는 변수, 커서 및 전용 요소(전방 선언)가 포함됩니다.
- 패키지의 마지막 부분은 세션에서 패키지가 처음 참조될 때마다 한 번 실행되는 패키지 초기화 부분입니다.
구문 :
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <global_declaration part> <Private element definition> <sub_program and public element definition> . <Package Initialization> END <package_name>
- 위 구문은 패키지 본문 생성을 보여줍니다.
이제 프로그램에서 패키지 요소를 참조하는 방법을 살펴보겠습니다.
패키지 요소 참조
패키지에서 요소가 선언되고 정의되면 해당 요소를 사용하기 위해 요소를 참조해야 합니다.
패키지의 모든 공개 요소는 패키지 이름 뒤에 마침표로 구분된 요소 이름을 호출하여 참조할 수 있습니다. . '.
패키지의 공개 변수는 동일한 방식으로 사용하여 값을 할당하고 가져올 수도 있습니다. 즉, ' . '.
PL/SQL에서 패키지 생성
PL/SQL에서는 세션에서 패키지가 참조/호출될 때마다 해당 패키지에 대해 새 인스턴스가 생성됩니다.
Oracle '패키지 초기화'를 통해 이 인스턴스 생성 시 패키지 요소를 초기화하거나 모든 활동을 수행하는 기능을 제공합니다.
이는 패키지 요소를 모두 정의한 후 패키지 본문에 작성하는 실행 블록에 불과합니다. 이 블록은 세션에서 패키지가 처음 참조될 때마다 실행됩니다.
통사론
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGINE <Package Initialization> END <package_name>
- 위 구문은 패키지 본문의 패키지 초기화 정의를 보여줍니다.
전방 선언
패키지 내에서 전방 선언/참조는 개인 요소를 별도로 선언하고 패키지 본문의 후반부에서 정의하는 것에 불과합니다.
Private 요소는 패키지 본문에 이미 선언된 경우에만 참조할 수 있습니다. 이러한 이유로 전방 선언이 사용됩니다. 그러나 대부분의 경우 개인 요소가 패키지 본문의 첫 번째 부분에서 선언되고 정의되기 때문에 사용하는 것은 다소 이례적입니다.
전방 선언은 다음에서 제공하는 옵션입니다. Oracle, 필수는 아니며 사용 여부는 프로그래머의 요구 사항에 달려 있습니다.
구문 :
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element declaration> . . . <Public element definition that refer the above private element> . . <Private element definition> . BEGIN <package_initialization code>; END <package_name>
위의 구문은 전방 선언을 보여줍니다. 개인 요소는 패키지의 전방 부분에서 별도로 선언되고, 후반 부분에서 정의되었습니다.
패키지 내 커서 사용법
다른 요소와 달리 패키지 내에서 커서를 사용할 때는 주의해야 합니다.
커서가 패키지 사양이나 패키지 본문의 전역 부분에 정의된 경우 한 번 열린 커서는 세션이 끝날 때까지 유지됩니다.
따라서 커서를 참조하기 전에 항상 커서 속성 '%ISOPEN'을 사용하여 커서 상태를 확인해야 합니다.
과부하
오버로딩은 동일한 이름을 가진 여러 하위 프로그램을 갖는 개념입니다. 이러한 서브프로그램은 매개변수 수, 매개변수 유형 또는 반환 유형에 따라 서로 다릅니다. 즉, 이름은 같지만 매개변수 수가 다른 서브프로그램, 매개변수 유형이 다르거나 재유형이 다른 경우 오버로드로 간주됩니다.
이는 많은 하위 프로그램이 동일한 작업을 수행해야 하지만 각 하위 프로그램을 호출하는 방법이 달라야 할 때 유용합니다. 이 경우 서브프로그램 이름은 모두 동일하게 유지되며 매개변수는 호출 명령문에 따라 변경됩니다.
예제 1: 이번 예제에서는 'emp' 테이블의 직원 정보 값을 가져오고 설정하는 패키지를 생성하겠습니다. get_record 함수는 주어진 직원 번호에 대한 레코드 유형 출력을 반환하고 set_record 프로시저는 레코드 유형 레코드를 emp 테이블에 삽입합니다.
단계 1) 패키지 사양 생성
CREATE OR REPLACE PACKAGE guru99_get_set IS PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE); FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE; END guru99_get_set: /
출력:
Package created
코드 설명
- 코드 라인 1-5: 하나의 프로시저와 하나의 함수로 guru99_get_set에 대한 패키지 사양을 생성합니다. 이 두 가지는 이제 이 패키지의 공개 요소입니다.
단계 2) 패키지에는 모든 프로시저와 기능의 실제 정의가 정의되는 패키지 본문이 포함되어 있습니다. 이 단계에서는 Package Body를 생성합니다.
CREATE OR REPLACE PACKAGE BODY guru99_get_set IS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE) IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO emp VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no; p_emp_rec.salary,p_emp_rec.manager); COMMIT; END set_record; FUNCTION get_record(p_emp_no IN NUMBER) RETURN emp%ROWTYPE IS l_emp_rec emp%ROWTYPE; BEGIN SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no RETURN l_emp_rec; END get_record; BEGUN dbms_output.put_line(‘Control is now executing the package initialization part'); END guru99_get_set: /
출력:
Package body created
코드 설명
- 코드 라인 7: 패키지 본체를 생성합니다.
- 코드 라인 9-16: 사양에 선언된 'set_record' 요소를 정의합니다. 이는 PL/SQL에서 독립형 프로시저를 정의하는 것과 같습니다.
- 코드 라인 17-24: 'get_record' 요소를 정의합니다. 독립형 기능을 정의하는 것과 같습니다.
- 코드 라인 25-26: 패키지 초기화 부분을 정의합니다.
단계 3) 위에서 생성된 패키지를 참조하여 기록을 삽입하고 표시하는 익명 블록을 생성합니다.
DECLARE l_emp_rec emp%ROWTYPE; l_get_rec emp%ROWTYPE; BEGIN dbms output.put line(‘Insert new record for employee 1004'); l_emp_rec.emp_no:=l004; l_emp_rec.emp_name:='CCC'; l_emp_rec.salary~20000; l_emp_rec.manager:=’BBB’; guru99_get_set.set_record(1_emp_rec); dbms_output.put_line(‘Record inserted'); dbms output.put line(‘Calling get function to display the inserted record'): l_get_rec:=guru99_get_set.get_record(1004); dbms_output.put_line(‘Employee name: ‘||l_get_rec.emp_name); dbms_output.put_line(‘Employee number:‘||l_get_rec.emp_no); dbms_output.put_line(‘Employee salary:‘||l_get_rec.salary'); dbms output.put line(‘Employee manager:‘||1_get_rec.manager); END: /
출력:
Insert new record for employee 1004 Control is now executing the package initialization part Record inserted Calling get function to display the inserted record Employee name: CCC Employee number: 1004 Employee salary: 20000 Employee manager: BBB
코드 설명 :
- 코드 라인 34-37: 패키지의 'set_record' 요소를 호출하기 위해 익명 블록에 레코드 유형 변수에 대한 데이터를 채웁니다.
- 코드 라인 38: guru99_get_set 패키지의 'set_record'에 대한 호출이 이루어졌습니다. 이제 패키지가 인스턴스화되어 세션이 끝날 때까지 유지됩니다.
- 패키지 초기화 부분은 패키지에 대한 첫 번째 호출이므로 실행됩니다.
- 'set_record' 요소에 의해 테이블에 삽입된 레코드입니다.
- 코드 라인 41: 'get_record' 요소를 호출하여 삽입된 직원의 세부 정보를 표시합니다.
- 패키지는 패키지에 대한 'get_record' 호출 중에 두 번째로 참조됩니다. 하지만 이번 세션에서는 이미 패키지가 초기화되었기 때문에 초기화 부분은 실행되지 않습니다.
- 코드 라인 42-45: 직원 세부 정보를 인쇄합니다.
패키지의 종속성
패키지는 관련된 것들의 논리적 그룹이기 때문에 몇 가지 종속성이 있습니다. 다음은 처리해야 할 종속성입니다.
- 사양은 독립형 개체입니다.
- 패키지 본문은 사양에 따라 다릅니다.
- 패키지 본문을 별도로 컴파일할 수 있습니다. 사양이 컴파일될 때마다 본문은 유효하지 않게 되므로 다시 컴파일해야 합니다.
- 전용 요소에 종속된 패키지 본문의 서브프로그램은 전용 요소 선언 이후에만 정의해야 합니다.
- 사양 및 본문에서 참조되는 데이터베이스 개체는 패키지 컴파일 시 유효한 상태여야 합니다.
패키지 정보
패키지 정보가 생성되면 패키지 소스, 하위 프로그램 세부 정보, 오버로드 세부 정보와 같은 패키지 정보를 사용할 수 있습니다. Oracle 데이터 정의 테이블.
아래 표에는 데이터 정의 테이블과 해당 테이블에서 사용할 수 있는 패키지 정보가 나와 있습니다.
테이블 이름 | 상품 설명 | 질문 |
---|---|---|
ALL_OBJECT | object_id, creation_date, last_ddl_time 등과 같은 패키지의 세부 정보를 제공합니다. 여기에는 모든 사용자가 생성한 객체가 포함됩니다. | SELECT * FROM all_objects 여기서 object_name =' ' |
USER_OBJECT | object_id, creation_date, last_ddl_time 등과 같은 패키지의 세부 정보를 제공합니다. 현재 사용자가 만든 개체가 포함됩니다. | SELECT * FROM user_objects 여기서 object_name =' ' |
ALL_소스 | 모든 사용자가 생성한 객체의 소스를 제공합니다. | SELECT * FROM all_source 여기서 이름=' ' |
USER_SOURCE | 현재 사용자가 만든 개체의 소스를 제공합니다. | SELECT * FROM user_source 여기서 이름=' ' |
ALL_PROCEDURES | 모든 사용자가 생성한 object_id, 오버로드 세부 정보 등의 하위 프로그램에 대한 세부 정보를 제공합니다. | SELECT * FROM all_procedures 여기서 object_name=' ' |
USER_PROCEDURES | 현재 사용자가 생성한 하위 프로그램의 세부 정보(object_id, 오버로드 세부 정보 등)를 제공합니다. | SELECT * FROM user_procedures 여기서 object_name=' ' |
UTL 파일 – 개요
UTL File은 에서 제공하는 별도의 유틸리티 패키지입니다. Oracle 특수 작업을 수행합니다. 이것은 주로 PL/SQL 패키지 또는 하위 프로그램에서 운영 체제 파일을 읽고 쓰는 데 사용됩니다. 정보를 넣고 파일에서 정보를 가져오는 별도의 기능을 가지고 있습니다. 또한 네이티브 문자 집합에서 읽고 쓸 수 있습니다.
프로그래머는 이것을 사용하여 모든 유형의 운영 체제 파일을 쓸 수 있으며 파일은 데이터베이스 서버에 직접 쓰여집니다. 이름과 디렉토리 경로는 쓰는 시점에 언급됩니다.
요약
우리는 이제 패키지를 배웠습니다. PL / SQL, 이제 다음 작업을 수행할 수 있게 되었습니다.
- PL/SQL 패키지 및 해당 구성요소
- 패키지의 특징
- 패키지 요소 참조 및 오버로드
- 패키지의 종속성 관리
- 패키지 정보 보기
- UTL 파일이란 무엇입니까?