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