Oracle PL / SQL-Paket: Typ, Spezifikation, Text (Beispiel)

Inhaltsverzeichnis:

Anonim

Was ist ein Paket in Oracle?

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

In diesem Tutorial lernen Sie:

  • Komponenten von Paketen
  • Paketspezifikation
  • Paketkörper
  • Verweisende Paketelemente
  • Paket in PL / SQL erstellen
  • Vorwärtserklärungen
  • Verwendung von Cursorn im Paket
  • Überlastung
  • Abhängigkeit in Paketen
  • Paketinformationen
  • UTL-DATEI - Ein Überblick

Komponenten von Paketen

Das PL / SQL-Paket besteht aus zwei Komponenten.

  • Paketspezifikation
  • Paketkörper

Paketspezifikation

Die Paketspezifikation besteht aus einer Deklaration aller öffentlichen 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 bedeutet, dass sie ohne Paketkörper allein existieren kann.
  • 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 
IS… END 

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 innerhalb des Pakets aufgerufen werden.

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

  • Es sollte Definitionen für alle Unterprogramme / Cursor enthalten, die in der Spezifikation deklariert wurden.
  • Es kann auch mehr Unterprogramme oder andere Elemente enthalten, die nicht in der Spezifikation deklariert sind. Diese werden als private Elemente bezeichnet.
  • Es ist ein zuverlässiges Objekt und hängt von der Paketspezifikation ab.
  • Der Status des Paketkörpers wird bei jeder Kompilierung der Spezifikation ungültig. Daher muss es jedes Mal nach der Erstellung 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. Dies umfasst 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 ein Paket zum ersten Mal in der Sitzung referenziert wird.

Syntax:

CREATE [OR REPLACE] PACKAGE BODY 
IS.END 
  • 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 zu verwenden.

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

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

Paket in PL / SQL erstellen

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

Oracle bietet die Möglichkeit, Paketelemente zu initialisieren oder Aktivitäten zum Zeitpunkt der Instanzerstellung über "Paketinitialisierung" auszuführen.

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

Syntax

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGINEEND 
  • Die obige Syntax zeigt die Definition der Paketinitialisierung im Paketkörper.

Vorwärtserklärungen

Die Weiterleitungsdeklaration / -referenz im Paket ist nichts anderes, als die privaten Elemente separat zu deklarieren und im späteren Teil des Paketkörpers zu definieren.

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

Die Weiterleitungsdeklaration ist eine von Oracle bereitgestellte Option. Sie ist nicht obligatorisch und die Verwendung und Nichtverwendung entspricht den Anforderungen des Programmierers.

Syntax:

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGIN
;END 

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

Verwendung von Cursorn im Paket

Im Gegensatz zu anderen Elementen muss bei der Verwendung von Cursorn im Paket vorsichtig vorgegangen werden.

Wenn der Cursor in der Paketspezifikation oder im globalen Teil des Paketkörpers definiert ist, bleibt der einmal geöffnete Cursor bis zum Ende der Sitzung bestehen.

Daher sollte man immer die Cursorattribute '% ISOPEN' verwenden, um den Status des Cursors zu überprüfen, bevor man auf ihn verweist.

Überlastung

Überladen ist das Konzept, viele Unterprogramme mit demselben Namen zu haben. Diese Unterprogramme unterscheiden sich durch eine Reihe von Parametern oder Parametertypen oder Rückgabetypen, dh Unterprogramme mit demselben Namen, aber unterschiedlicher Anzahl von Parametern, unterschiedlichen Parametertypen oder unterschiedlichen Retypen werden als Überladung betrachtet.

Dies ist nützlich, wenn viele Unterprogramme dieselbe Aufgabe ausführen müssen, die Art und Weise, wie sie aufgerufen werden, jedoch unterschiedlich sein sollte. In diesem Fall bleibt der Name des Unterprogramms für alle gleich und die Parameter werden gemäß 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 Datensatztypausgabe für die angegebene Mitarbeiternummer zurück, und die Prozedur set_record fügt den Datensatztypdatensatz in die Tabelle emp ein.

Schritt 1) Erstellung der Paketspezifikation

CREATE OR REPLACE PACKAGE guru99_get_setISPROCEDURE set_record (p_emp_rec IN emp%ROWTYPE);FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE;END guru99_get_set:/

Ausgabe:

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 jetzt öffentliche Elemente dieses Pakets.

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

CREATE OR REPLACE PACKAGE BODY guru99_get_setIS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)ISPRAGMA AUTONOMOUS_TRANSACTION;BEGININSERT INTO empVALUES(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%ROWTYPEISl_emp_rec emp%ROWTYPE;BEGINSELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_noRETURN l_emp_rec;END get_record;BEGUN dbms_output.put_line(‘Control is now executing the package initialization part');END guru99_get_set:/

Ausgabe:

Package body created

Code Erklärung

  • Codezeile 7 : Erstellen des Paketkörpers.
  • Codezeile 9-16 : Definieren des in der Spezifikation deklarierten Elements 'set_record'. Dies entspricht der Definition der eigenständigen Prozedur in PL / SQL.
  • Codezeile 17-24: Definieren des Elements 'get_record'. Dies entspricht der Definition der Standalone-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.

DECLAREl_emp_rec emp%ROWTYPE;l_get_rec emp%ROWTYPE;BEGINdbms 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:/

Ausgabe:

Insert new record for employee 1004Control is now executing the package initialization partRecord insertedCalling get function to display the inserted recordEmployee name: CCCEmployee number: 1004Employee salary: 20000Employee manager: BBB

Code Erläuterung:

  • Codezeile 34-37: Auffüllen der Daten für die Datensatztypvariable in einem anonymen Block zum Aufrufen des Elements 'set_record' des Pakets.
  • Codezeile 38: 'set_record' des Pakets guru99_get_set wurde 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 vom Element 'set_record' in die Tabelle eingefügt.
  • Codezeile 41: Aufrufen des Elements 'get_record', um die Details des eingefügten Mitarbeiters anzuzeigen.
  • Das Paket wird zum zweiten Mal während des Aufrufs 'get_record' an das Paket verwiesen. Der Initialisierungsteil wird diesmal jedoch nicht ausgeführt, da das Paket bereits in dieser Sitzung initialisiert wurde.
  • Codezeile 42-45: Drucken der Mitarbeiterdaten.

Abhängigkeit in Paketen

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

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

Paketinformationen

Sobald die Paketinformationen erstellt wurden, sind die Paketinformationen wie Paketquelle, Unterprogrammdetails und Überladungsdetails in den Oracle-Datendefinitionstabellen verfügbar.

Die folgende Tabelle enthält die Datendefinitionstabelle und die Paketinformationen, die in der Tabelle verfügbar sind.

Tabellenname Beschreibung Abfrage
ALL_OBJECT Gibt die Details des Pakets wie Objekt-ID, Erstellungsdatum, Letzte_Late_Zeit usw. an. Es enthält die von allen Benutzern erstellten Objekte. SELECT * FROM all_objects wobei object_name = ''
USER_OBJECT Gibt die Details des Pakets wie Objekt-ID, Erstellungsdatum, Letzte_Late_Zeit usw. an. Es enthält die vom aktuellen Benutzer erstellten Objekte. SELECT * FROM Benutzerobjekte wobei Objektname = ''
ALL_SOURCE Gibt die Quelle der Objekte an, die von allen Benutzern erstellt wurden. SELECT * FROM all_source wobei name = ''
USER_SOURCE Gibt die Quelle der vom aktuellen Benutzer erstellten Objekte an. SELECT * FROM user_source wobei name = ''
ALL_PROCEDURES Gibt die von allen Benutzern erstellten Unterprogrammdetails wie object_id, Überladungsdetails usw. an. SELECT * FROM all_procedures Wobei object_name = ''
USER_PROCEDURES Gibt die vom aktuellen Benutzer erstellten Unterprogrammdetails wie object_id, Überladungsdetails usw. an. SELECT * FROM user_procedures Wobei object_name = ''

UTL-DATEI - Ein Überblick

UTL-Datei ist das separate Dienstprogrammpaket, das von Oracle zur Ausführung spezieller Aufgaben bereitgestellt wird. Dies wird hauptsächlich zum Lesen und Schreiben der Betriebssystemdateien aus PL / SQL-Paketen oder Unterprogrammen verwendet. Es hat die separaten Funktionen, um die Informationen zu platzieren und die Informationen aus Dateien zu erhalten. Es ermöglicht auch das Lesen / Schreiben im nativen Zeichensatz.

Der Programmierer kann dies verwenden, um Betriebssystemdateien eines beliebigen Typs zu schreiben, und die Datei wird direkt auf den Datenbankserver geschrieben. Der Name und der Verzeichnispfad werden zum Zeitpunkt des Schreibens angegeben.

Zusammenfassung

Wir haben jetzt die Pakete in PL / SQL gelernt, und Sie sollten jetzt in der Lage sein, im Folgenden zu arbeiten.

  • 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?