Учебники

PL / SQL — пакеты

В этой главе мы обсудим пакеты в PL / SQL. Пакеты — это объекты схемы, которые группируют логически связанные типы, переменные и подпрограммы PL / SQL.

Пакет будет состоять из двух обязательных частей —

  • Спецификация упаковки
  • Тело пакета или определение

Спецификация упаковки

Спецификация — это интерфейс к пакету. Он просто ОБЪЯВЛЯЕТ типы, переменные, константы, исключения, курсоры и подпрограммы, на которые можно ссылаться извне пакета. Другими словами, он содержит всю информацию о содержимом пакета, но исключает код для подпрограмм.

Все объекты, размещенные в спецификации, называются открытыми объектами. Любая подпрограмма, не указанная в спецификации пакета, но закодированная в теле пакета, называется закрытым объектом.

Следующий фрагмент кода показывает спецификацию пакета с одной процедурой. Вы можете иметь много глобальных переменных, определенных и несколько процедур или функций внутри пакета.

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

Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —

Package created.

Корпус

Тело пакета содержит коды для различных методов, объявленных в спецификации пакета и других частных объявлений, которые скрыты от кода вне пакета.

Оператор CREATE PACKAGE BODY используется для создания тела пакета. В следующем фрагменте кода показано объявление тела пакета для пакета cust_sal , созданного выше. Я предположил, что у нас уже есть таблица CUSTOMERS, созданная в нашей базе данных, как упомянуто в главе PL / SQL — переменные .

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, он предлагает ввести идентификатор клиента, а когда вы вводите идентификатор, он отображает соответствующую зарплату следующим образом:

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; 
/

Приведенный выше пример использует вложенную таблицу . Мы обсудим концепцию вложенной таблицы в следующей главе.

Когда приведенный выше код выполняется в командной строке 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, он дает следующий результат —