PL / SQL-패키지

이 장에서는 PL / SQL의 패키지에 대해 설명합니다. 패키지는 논리적으로 관련된 PL / SQL 유형, 변수 및 하위 프로그램을 그룹화하는 스키마 객체입니다.

패키지에는 두 개의 필수 부분이 있습니다.

  • 패키지 사양
  • 패키지 본문 또는 정의

패키지 사양

사양은 패키지에 대한 인터페이스입니다. 그냥DECLARES패키지 외부에서 참조 할 수있는 유형, 변수, 상수, 예외, 커서 및 하위 프로그램. 즉, 패키지 내용에 대한 모든 정보를 포함하지만 하위 프로그램에 대한 코드는 제외합니다.

사양에있는 모든 개체가 호출됩니다. public사물. 패키지 사양에는 없지만 패키지 본문에 코딩 된 모든 하위 프로그램을private 목적.

다음 코드 조각은 단일 프로 시저가있는 패키지 사양을 보여줍니다. 패키지 내에 정의 된 여러 전역 변수와 여러 프로 시저 또는 함수를 가질 수 있습니다.

CREATE PACKAGE cust_sal AS 
   PROCEDURE find_sal(c_id customers.id%type); 
END cust_sal; 
/

위의 코드가 SQL 프롬프트에서 실행되면 다음 결과가 생성됩니다.

Package created.

패키지 본체

패키지 본문에는 패키지 사양에 선언 된 다양한 메서드에 대한 코드와 패키지 외부의 코드에서 숨겨지는 기타 개인 선언이 있습니다.

그만큼 CREATE PACKAGE BODY문은 패키지 본문을 만드는 데 사용됩니다. 다음 코드 스 니펫은cust_sal위에서 만든 패키지. PL / SQL-Variables 장 에서 언급 한대로 데이터베이스에 CUSTOMERS 테이블이 이미 생성되어 있다고 가정했습니다 .

CREATE OR REPLACE PACKAGE BODY cust_sal AS  
   
   PROCEDURE find_sal(c_id customers.id%TYPE) IS 
   c_sal customers.salary%TYPE; 
   BEGIN 
      SELECT salary INTO c_sal 
      FROM customers 
      WHERE id = c_id; 
      dbms_output.put_line('Salary: '|| c_sal); 
   END find_sal; 
END cust_sal; 
/

위의 코드가 SQL 프롬프트에서 실행되면 다음 결과가 생성됩니다.

Package body created.

패키지 요소 사용

패키지 요소 (변수, 절차 또는 함수)는 다음 구문으로 액세스됩니다.

package_name.element_name;

데이터베이스 스키마에 위의 패키지를 이미 만들었습니다. 다음 프로그램은 find_sal 의 방법 cust_sal 패키지 −

DECLARE 
   code customers.id%type := &cc_id; 
BEGIN 
   cust_sal.find_sal(code); 
END; 
/

SQL 프롬프트에서 위의 코드를 실행하면 고객 ID를 입력하라는 메시지가 표시되고 ID를 입력하면 해당 급여가 다음과 같이 표시됩니다.

Enter value for cc_id: 1 
Salary: 3000 

PL/SQL procedure successfully completed.

다음 프로그램은보다 완전한 패키지를 제공합니다. 우리는 다음 레코드와 함께 데이터베이스에 저장된 CUSTOMERS 테이블을 사용합니다.

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  3000.00 | 
|  2 | Khilan   |  25 | Delhi     |  3000.00 | 
|  3 | kaushik  |  23 | Kota      |  3000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  7500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  9500.00 | 
|  6 | Komal    |  22 | MP        |  5500.00 | 
+----+----------+-----+-----------+----------+

패키지 사양

CREATE OR REPLACE PACKAGE c_package AS 
   -- Adds a customer 
   PROCEDURE addCustomer(c_id   customers.id%type, 
   c_name  customerS.No.ame%type, 
   c_age  customers.age%type, 
   c_addr customers.address%type,  
   c_sal  customers.salary%type); 
   
   -- Removes a customer 
   PROCEDURE delCustomer(c_id  customers.id%TYPE); 
   --Lists all customers 
   PROCEDURE listCustomer; 
  
END c_package; 
/

위의 코드가 SQL 프롬프트에서 실행되면 위의 패키지를 생성하고 다음 결과를 표시합니다.

Package created.

패키지 본문 생성

CREATE OR REPLACE PACKAGE BODY c_package AS 
   PROCEDURE addCustomer(c_id  customers.id%type, 
      c_name customerS.No.ame%type, 
      c_age  customers.age%type, 
      c_addr  customers.address%type,  
      c_sal   customers.salary%type) 
   IS 
   BEGIN 
      INSERT INTO customers (id,name,age,address,salary) 
         VALUES(c_id, c_name, c_age, c_addr, c_sal); 
   END addCustomer; 
   
   PROCEDURE delCustomer(c_id   customers.id%type) IS 
   BEGIN 
      DELETE FROM customers 
      WHERE id = c_id; 
   END delCustomer;  
   
   PROCEDURE listCustomer IS 
   CURSOR c_customers is 
      SELECT  name FROM customers; 
   TYPE c_list is TABLE OF customers.Name%type; 
   name_list c_list := c_list(); 
   counter integer :=0; 
   BEGIN 
      FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list.extend; 
      name_list(counter) := n.name; 
      dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter)); 
      END LOOP; 
   END listCustomer;
   
END c_package; 
/

위의 예는 nested table. 다음 장에서 중첩 테이블의 개념에 대해 설명합니다.

위의 코드가 SQL 프롬프트에서 실행되면 다음 결과가 생성됩니다.

Package body created.

패키지 사용

다음 프로그램은 c_package 패키지에 선언되고 정의 된 메소드를 사용합니다 .

DECLARE 
   code customers.id%type:= 8; 
BEGIN 
   c_package.addcustomer(7, 'Rajnish', 25, 'Chennai', 3500); 
   c_package.addcustomer(8, 'Subham', 32, 'Delhi', 7500); 
   c_package.listcustomer; 
   c_package.delcustomer(code); 
   c_package.listcustomer; 
END; 
/

위의 코드가 SQL 프롬프트에서 실행되면 다음 결과가 생성됩니다.

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal 
Customer(7): Rajnish 
Customer(8): Subham 
Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal
Customer(7): Rajnish 

PL/SQL procedure successfully completed