PL / SQL - Pakete

In diesem Kapitel werden die Pakete in PL / SQL erläutert. Pakete sind Schemaobjekte, die logisch verwandte PL / SQL-Typen, Variablen und Unterprogramme gruppieren.

Ein Paket besteht aus zwei obligatorischen Teilen -

  • Paketspezifikation
  • Paketkörper oder Definition

Paketspezifikation

Die Spezifikation ist die Schnittstelle zum Paket. Es geradeDECLARESdie Typen, Variablen, Konstanten, Ausnahmen, Cursor und Unterprogramme, auf die von außerhalb des Pakets verwiesen werden kann. Mit anderen Worten, es enthält alle Informationen zum Inhalt des Pakets, schließt jedoch den Code für die Unterprogramme aus.

Alle in der Spezifikation platzierten Objekte werden aufgerufen publicObjekte. Jedes Unterprogramm, das nicht in der Paketspezifikation enthalten ist, sondern im Paketkörper codiert ist, wird als a bezeichnetprivate Objekt.

Das folgende Codeausschnitt zeigt eine Paketspezifikation mit einer einzelnen Prozedur. Sie können viele globale Variablen und mehrere Prozeduren oder Funktionen in einem Paket definieren.

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

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Package created.

Paketkörper

Der Paketkörper verfügt über die Codes für verschiedene in der Paketspezifikation deklarierte Methoden und andere private Deklarationen, die außerhalb des Pakets vor dem Code verborgen sind.

Das CREATE PACKAGE BODYDie Anweisung wird zum Erstellen des Paketkörpers verwendet. Das folgende Codeausschnitt zeigt die Paketkörperdeklaration für dascust_salPaket oben erstellt. Ich ging davon aus, dass wir bereits eine CUSTOMERS-Tabelle in unserer Datenbank erstellt haben, wie im Kapitel PL / SQL - Variablen erwähnt .

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

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Package body created.

Verwenden der Paketelemente

Auf die Paketelemente (Variablen, Prozeduren oder Funktionen) wird mit der folgenden Syntax zugegriffen:

package_name.element_name;

Bedenken Sie, dass wir das obige Paket bereits in unserem Datenbankschema erstellt haben. Das folgende Programm verwendet das find_sal Methode der cust_sal Paket -

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

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, werden Sie zur Eingabe der Kunden-ID aufgefordert. Wenn Sie eine ID eingeben, wird das entsprechende Gehalt wie folgt angezeigt:

Enter value for cc_id: 1 
Salary: 3000 

PL/SQL procedure successfully completed.

Beispiel

Das folgende Programm bietet ein vollständigeres Paket. Wir werden die in unserer Datenbank gespeicherte Tabelle CUSTOMERS mit den folgenden Datensätzen verwenden:

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 | 
+----+----------+-----+-----------+----------+

Die Paketspezifikation

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

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das obige Paket erstellt und das folgende Ergebnis angezeigt:

Package created.

Erstellen des Paketkörpers

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

Das obige Beispiel verwendet die nested table. Wir werden das Konzept der verschachtelten Tabelle im nächsten Kapitel diskutieren.

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

Package body created.

Verwenden des Pakets

Das folgende Programm verwendet die im Paket c_package deklarierten und definierten Methoden .

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

Wenn der obige Code an der SQL-Eingabeaufforderung ausgeführt wird, wird das folgende Ergebnis ausgegeben:

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