Oracle PL/SQL 패키지: 유형, 사양, 본문 [예]

패키지란 무엇입니까? Oracle?

PL/SQL 패키지는 관련 하위 프로그램(프로시저/함수)을 단일 요소로 논리적으로 그룹화한 것입니다. 패키지는 사용할 수 있는 데이터베이스 개체로 컴파일되고 저장됩니다. later.

패키지 구성요소

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 '패키지 초기화'를 통해 이 인스턴스 생성 시 패키지 요소를 초기화하거나 모든 활동을 수행하는 기능을 제공합니다.

이는 패키지 요소를 모두 정의한 후 패키지 본문에 작성하는 실행 블록에 불과합니다. 이 블록은 세션에서 패키지가 처음 참조될 때마다 실행됩니다.

통사론

PL/SQL에서 패키지 생성

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element definition>
<sub_program and public element definition>
.
BEGINE
<Package Initialization> 
END <package_name>
  • 위 구문은 패키지 본문의 패키지 초기화 정의를 보여줍니다.

전방 선언

패키지의 전방 선언/참조는 전용 요소를 별도로 선언하고 이를 정의하는 것 외에는 아무것도 아닙니다. later 패키지 본체의 일부입니다.

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>

위 구문은 전방 선언을 보여줍니다. 비공개 요소는 패키지의 앞쪽 부분에서 별도로 선언되며, later 부품.

패키지 내 커서 사용법

다른 요소와 달리 패키지 내에서 커서를 사용할 때는 주의해야 합니다.

커서가 패키지 사양이나 패키지 본문의 전역 부분에 정의된 경우 한 번 열린 커서는 세션이 끝날 때까지 유지됩니다.

따라서 커서를 참조하기 전에 항상 커서 속성 '%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: de를 표시하기 위해 'get_record' 요소 호출tails 삽입된 직원의
  • 패키지는 패키지에 대한 'get_record' 호출 중에 두 번째로 참조됩니다. 하지만 이번 세션에서는 이미 패키지가 초기화되었기 때문에 초기화 부분은 실행되지 않습니다.
  • 코드 라인 42-45: 직원 정보 인쇄tails.

패키지의 종속성

패키지는 관련된 항목을 논리적으로 그룹화한 것이므로 일부 종속성을 갖습니다. 폴로wing 주의해야 할 종속성입니다.

  • 사양은 독립형 개체입니다.
  • 패키지 본문은 사양에 따라 다릅니다.
  • 패키지 본문을 별도로 컴파일할 수 있습니다. 사양이 컴파일될 때마다 본문은 유효하지 않게 되므로 다시 컴파일해야 합니다.
  • 전용 요소에 종속된 패키지 본문의 서브프로그램은 전용 요소 선언 이후에만 정의해야 합니다.
  • 사양 및 본문에서 참조되는 데이터베이스 개체는 패키지 컴파일 시 유효한 상태여야 합니다.

패키지 정보

패키지 정보가 생성되면 패키지 소스, 서브 프로그램 드 등의 패키지 정보가 생성됩니다.tails, 그리고 과부하 드tails 사용할 수 있습니다 Oracle 데이터 정의 테이블.

아래 표에는 데이터 정의 테이블과 해당 테이블에서 사용할 수 있는 패키지 정보가 나와 있습니다.

테이블 이름 상품 설명 질문
ALL_OBJECT 드를 준다tails object_id, Creation_date, last_ddl_time 등과 같은 패키지에는 모든 사용자가 만든 개체가 포함됩니다. SELECT * FROM all_objects 여기서 object_name =' '
USER_OBJECT 드를 준다tails 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 서브프로그램 de를 제공합니다.tails object_id와 같은 오버로드 드tails등은 모든 사용자가 생성합니다. SELECT * FROM all_procedures
여기서 object_name=' '
USER_PROCEDURES 서브프로그램 de를 제공합니다.tails object_id와 같은 오버로드 드tails, 등은 현재 사용자가 생성합니다. SELECT * FROM user_procedures
여기서 object_name=' '

UTL 파일 – 개요

UTL File은 에서 제공하는 별도의 유틸리티 패키지입니다. Oracle 특별한 임무를 수행하기 위해. 이는 주로 PL/SQL 패키지 또는 하위 프로그램에서 운영 체제 파일을 읽고 쓰는 데 사용됩니다. 정보를 저장하는 기능과 파일에서 정보를 가져오는 기능이 별도로 있습니다. 또한 기본 문자 집합에서 읽기/쓰기가 가능합니다.

프로그래머는 이를 사용하여 모든 유형의 운영 체제 파일을 쓸 수 있으며 파일은 데이터베이스 서버에 직접 기록됩니다. 이름과 디렉터리 경로는 작성 시 언급됩니다.

요약

우리는 이제 패키지를 배웠습니다. PL / SQL, 이제 팔로우에서 작업할 수 있습니다.wing.

  • PL/SQL 패키지 및 해당 구성요소
  • 패키지의 특징
  • 패키지 요소 참조 및 오버로드
  • 패키지의 종속성 관리
  • 경쟁wing 패키지 정보
  • UTL 파일이란 무엇입니까?