Oracle PL/SQL-Paket: Typ, Spezifikation, Hauptteil [Beispiel]

Was ist im Paket enthalten? Oracle?

Ein PL/SQL-Paket ist eine logische Gruppierung eines zugehörigen Unterprogramms (Prozedur/Funktion) in einem einzigen Element. Ein Paket wird kompiliert und als Datenbankobjekt gespeichert, das später verwendet werden kann.

Komponenten von Paketen

Das PL/SQL-Paket besteht aus zwei Komponenten.

  • Paketspezifikation
  • Paketkörper

Paketspezifikation

Die Paketspezifikation besteht aus einer Erklärung der gesamten Öffentlichkeit Variablen, Cursor, Objekte, Prozeduren, Funktionen und Ausnahmen.

Nachfolgend sind einige Merkmale der Paketspezifikation aufgeführt.

  • Auf die Elemente, die alle in der Spezifikation deklariert sind, kann von außerhalb des Pakets zugegriffen werden. Solche Elemente werden als öffentliches Element bezeichnet.
  • Die Paketspezifikation ist ein eigenständiges Element, das heißt, sie kann allein ohne Paketkörper existieren.
  • Immer wenn ein Paket verwiesen hat, wird eine Instanz des Pakets für diese bestimmte Sitzung erstellt.
  • Nachdem die Instanz für eine Sitzung erstellt wurde, sind alle in dieser Instanz initiierten Paketelemente bis zum Ende der Sitzung gültig.

Syntax

CREATE [OR REPLACE] PACKAGE <package_name> 
IS
<sub_program and public element declaration>
.
.
END <package name>

Die obige Syntax zeigt die Erstellung der Paketspezifikation.

Paketkörper

Es besteht aus der Definition aller Elemente, die in der Paketspezifikation vorhanden sind. Es kann auch eine Definition von Elementen enthalten, die nicht in der Spezifikation deklariert sind. Diese Elemente werden als private Elemente bezeichnet und können nur aus dem Paket heraus aufgerufen werden.

Nachfolgend sind die Merkmale eines Paketkörpers aufgeführt.

  • Es sollte Definitionen für alle Unterprogramme/ enthalten.Cursor die in der Spezifikation deklariert wurden.
  • Es kann auch weitere Unterprogramme oder andere Elemente enthalten, die nicht in der Spezifikation deklariert sind. Diese werden private Elemente genannt.
  • Es ist ein zuverlässiges Objekt und hängt von der Paketspezifikation ab.
  • Der Status des Paketkörpers wird „Ungültig“, wenn die Spezifikation kompiliert wird. Daher muss es jedes Mal nach der Kompilierung der Spezifikation neu kompiliert werden.
  • Die privaten Elemente sollten zuerst definiert werden, bevor sie im Paketkörper verwendet werden.
  • Der erste Teil des Pakets ist der globale Deklarationsteil. Dazu gehören Variablen, Cursor und private Elemente (Forward-Deklaration), die für das gesamte Paket sichtbar sind.
  • Der letzte Teil des Pakets ist der Paketinitialisierungsteil, der einmal ausgeführt wird, wenn auf ein Paket zum ersten Mal in der Sitzung verwiesen wird.

Syntax:

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>
  • Die obige Syntax zeigt die Erstellung des Paketkörpers.

Jetzt werden wir sehen, wie Paketelemente im Programm referenziert werden.

Verweisende Paketelemente

Sobald die Elemente im Paket deklariert und definiert sind, müssen wir auf die Elemente verweisen, um sie verwenden zu können.

Auf alle öffentlichen Elemente des Pakets kann verwiesen werden, indem der Paketname gefolgt vom Elementnamen, getrennt durch einen Punkt, aufgerufen wird, z. B. „ . '.

Die öffentliche Variable des Pakets kann auf die gleiche Weise auch zum Zuweisen und Abrufen von Werten verwendet werden, z. B. ' . '.

Erstellen Sie ein Paket in PL/SQL

In PL/SQL wird immer dann, wenn in einer Sitzung auf ein Paket verwiesen/aufgerufen wird, eine neue Instanz für dieses Paket erstellt.

Oracle Bietet eine Möglichkeit, Paketelemente zu initialisieren oder beliebige Aktivitäten zum Zeitpunkt der Instanzerstellung durch „Paketinitialisierung“ auszuführen.

Dies ist nichts anderes als ein Ausführungsblock, der nach der Definition aller Paketelemente in den Paketkörper geschrieben wird. Dieser Block wird immer dann ausgeführt, wenn auf ein Paket zum ersten Mal in der Sitzung verwiesen wird.

Syntax

Erstellen Sie ein Paket in 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>
  • Die obige Syntax zeigt die Definition der Paketinitialisierung im Pakethauptteil.

Weiterleitungserklärungen

Eine Vorwärtsdeklaration/-referenz im Paket bedeutet nichts anderes, als die privaten Elemente separat zu deklarieren und sie später im Paketkörper zu definieren.

Auf private Elemente kann nur verwiesen werden, wenn sie bereits im Pakethauptteil deklariert sind. Aus diesem Grund wird die Vorwärtsdeklaration verwendet. Die Verwendung ist jedoch eher ungewöhnlich, da private Elemente in den meisten Fällen im ersten Teil des Paketkörpers deklariert und definiert werden.

Die Vorwärtsdeklaration ist eine Option von Oracle, es ist nicht obligatorisch und die Verwendung und Nichtverwendung hängt von den Anforderungen des Programmierers ab.

Weiterleitungserklärungen

Syntax:

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>

Die obige Syntax zeigt eine Vorwärtsdeklaration. Die privaten Elemente werden im Vorwärtsteil des Pakets separat deklariert und im späteren Teil definiert.

Verwendung von Cursorn im Paket

Im Gegensatz zu anderen Elementen muss man bei der Verwendung von Cursorn innerhalb des Pakets vorsichtig sein.

Wenn der Cursor in der Paketspezifikation oder im globalen Teil des Paketkörpers definiert ist, bleibt der Cursor nach dem Öffnen bis zum Ende der Sitzung bestehen.

Daher sollte man immer die Cursorattribute „%ISOPEN“ verwenden, um den Status des Cursors zu überprüfen, bevor man darauf verweist.

Überlastung

Unter Überladung versteht man das Konzept, dass es viele Unterprogramme mit demselben Namen gibt. Diese Unterprogramme unterscheiden sich voneinander durch eine Anzahl von Parametern oder Parametertypen oder Rückgabetypen, dh Unterprogramme mit demselben Namen, aber mit unterschiedlicher Anzahl von Parametern, unterschiedlichen Parametertypen oder unterschiedlichem Neutyp werden als Überladung betrachtet.

Dies ist nützlich, wenn viele Unterprogramme dieselbe Aufgabe erledigen müssen, die Art und Weise, wie sie aufgerufen werden, jedoch unterschiedlich sein soll. In diesem Fall bleibt der Name des Unterprogramms für alle gleich und die Parameter werden entsprechend der aufrufenden Anweisung geändert.

Beispiel 1: In diesem Beispiel erstellen wir ein Paket, um die Werte der Mitarbeiterinformationen in der Tabelle „emp“ abzurufen und festzulegen. Die Funktion get_record gibt die Datensatztyp-Ausgabe für die angegebene Mitarbeiternummer zurück und die Prozedur set_record fügt den Datensatztyp-Datensatz in die emp-Tabelle ein.

Schritt 1) Erstellung von Paketspezifikationen

Überlastung

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

Ausgang:

Package created

Code Erklärung

  • Codezeile 1-5: Erstellen der Paketspezifikation für guru99_get_set mit einer Prozedur und einer Funktion. Diese beiden sind nun öffentliche Elemente dieses Pakets.

Schritt 2) Das Paket enthält den Paketkörper, in dem die eigentliche Definition aller Prozeduren und Funktionen definiert wird. In diesem Schritt wird der Paketkörper erstellt.

Überlastung

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

Ausgang:

Package body created

Code Erklärung

  • Codezeile 7: Erstellen des Paketkörpers.
  • Codezeile 9-16: Definieren des Elements „set_record“, das in der Spezifikation deklariert ist. Dies entspricht der Definition der eigenständigen Prozedur in PL/SQL.
  • Codezeile 17-24: Definieren des Elements „get_record“. Dies entspricht der Definition der eigenständigen Funktion.
  • Codezeile 25-26: Definieren des Paketinitialisierungsteils.

Schritt 3) Erstellen eines anonymen Blocks zum Einfügen und Anzeigen der Datensätze unter Bezugnahme auf das oben erstellte Paket.

Überlastung

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

Ausgang:

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

Code-Erklärung:

  • Codezeile 34-37: Füllen der Daten für die Datensatztypvariable in einem anonymen Block, um das Element „set_record“ des Pakets aufzurufen.
  • Codezeile 38: Es wurde „set_record“ des Pakets guru99_get_set aufgerufen. Jetzt wird das Paket instanziiert und bleibt bis zum Ende der Sitzung bestehen.
  • Der Paketinitialisierungsteil wird ausgeführt, da dies der erste Aufruf des Pakets ist.
  • Der Datensatz wird durch das Element „set_record“ in die Tabelle eingefügt.
  • Codezeile 41: Aufruf des Elements „get_record“, um die Details des eingefügten Mitarbeiters anzuzeigen.
  • Beim Aufruf von „get_record“ auf das Paket wird das Paket zum zweiten Mal referenziert. Der Initialisierungsteil wird dieses Mal jedoch nicht ausgeführt, da das Paket in dieser Sitzung bereits initialisiert wurde.
  • Codezeile 42-45: Ausdrucken der Mitarbeiterdaten.

Abhängigkeit in Paketen

Da das Paket die logische Gruppierung verwandter Dinge ist, weist es einige Abhängigkeiten auf. Im Folgenden sind die Abhängigkeiten aufgeführt, die beachtet werden müssen.

  • Eine Spezifikation ist ein eigenständiges Objekt.
  • Ein Pakettext hängt von der Spezifikation ab.
  • Der Paketkörper kann separat kompiliert werden. Immer wenn eine Spezifikation kompiliert wird, muss der Hauptteil neu kompiliert werden, da er sonst ungültig wird.
  • Das Unterprogramm im Paketkörper, das von einem privaten Element abhängig ist, sollte erst nach der Deklaration des privaten Elements definiert werden.
  • Die Datenbankobjekte, auf die in der Spezifikation und im Hauptteil verwiesen wird, müssen zum Zeitpunkt der Paketkompilierung einen gültigen Status haben.

Paketinformationen

Sobald die Paketinformationen erstellt sind, stehen die Paketinformationen wie Paketquelle, Unterprogrammdetails und Überladungsdetails im Oracle Datendefinitionstabellen.

Die folgende Tabelle enthält die Datendefinitionstabelle und die in der Tabelle verfügbaren Paketinformationen.

Tabellenname Beschreibung Abfrage
ALL_OBJECT Gibt die Details des Pakets an, wie Objekt-ID, Erstellungsdatum, letzte DDL-Zeit usw. Es enthält die von allen Benutzern erstellten Objekte. SELECT * FROM all_objects where object_name =' '
USER_OBJECT Gibt die Details des Pakets an, wie Objekt-ID, Erstellungsdatum, letzte DDL-Zeit usw. Es enthält die vom aktuellen Benutzer erstellten Objekte. SELECT * FROM user_objects where object_name =' '
ALL_SOURCE Gibt die Quelle der von allen Benutzern erstellten Objekte an. SELECT * FROM all_source where name=' '
USER_SOURCE Gibt die Quelle der vom aktuellen Benutzer erstellten Objekte an. SELECT * FROM user_source where name=' '
ALLE_PROZEDUREN Gibt die von allen Benutzern erstellten Unterprogrammdetails wie Objekt-ID, Überladungsdetails usw. an. SELECT * FROM all_procedures
Wo object_name=' '
USER_PROCEDURES Gibt die vom aktuellen Benutzer erstellten Unterprogrammdetails wie Objekt-ID, Überladungsdetails usw. an. SELECT * FROM user_procedures
Wo object_name=' '

UTL-DATEI – Ein Überblick

UTL File ist das separate Dienstprogrammpaket von Oracle um spezielle Aufgaben auszuführen. Dies wird hauptsächlich zum Lesen und Schreiben der Betriebssystemdateien aus PL/SQL-Paketen oder Unterprogrammen verwendet. Es verfügt über separate Funktionen zum Einfügen und Abrufen der Informationen aus Dateien. Es ermöglicht auch das Lesen/Schreiben im nativen Zeichensatz.

Der Programmierer kann damit Betriebssystemdateien jeden Typs schreiben und die Datei wird direkt auf den Datenbankserver geschrieben. Der Name und der Verzeichnispfad werden beim Schreiben angegeben.

Zusammenfassung

Wir haben jetzt die Pakete gelernt PL / SQL, und Sie sollten nun im Folgenden arbeiten können.

  • PL/SQL-Pakete und ihre Komponenten
  • Eigenschaften von Paketen
  • Verweisen und Überladen von Paketelementen
  • Verwalten von Abhängigkeiten in Paketen
  • Paketinformationen anzeigen
  • Was ist eine UTL-Datei?