Suche…
Syntax
CREATE [ODER REPLACE] PACKAGE Paketname
[AUTHID {CURRENT_USER | DEFINER}]
{IS | WIE}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[Untertypdefinition ...]
[collection_declaration ...]
[Konstantenerklärung]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable Aussage ...]
[cursor_spec ...]
[function_spec ...]
[procedure_spec ...]
[call_spec ...]
[PRAGMA RESTRICT_REFERENCES (Zusicherungen) ...]
END [Paketname];
PAKET ERSTELLEN ODER ERSETZEN PackageName IS
FUNKTION Funktionsname (Parameter1 IN VARCHAR2, Parameter2 IN NUMMER) RETURN VARCHAR2;
END PackageName;
ERSTELLEN SIE [ODER ERSETZEN] PACKAGE BODY Paketname
{IS | WIE}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[Untertypdefinition ...]
[collection_declaration ...]
[Konstantenerklärung]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable Aussage ...]
[Cursor_Body ...]
[function_spec ...]
[procedure_spec ...]
[call_spec ...]
END [Paketname];
ERSTELLEN ODER ERSETZEN DES PAKETKÖRPERS PackageName IS
FUNCTION FunctionName (Parameter1 IN VARCHAR2, Parameter2 IN NUMMER) RETURN VARCHAR2 IS
Erklärungen
START
auszuführende Anweisungen
RETURN Variable Varchar2
END Funktionsname;
END PackageName;
Paketverwendung
Pakete in PLSQL sind eine Sammlung von Prozeduren, Funktionen, Variablen, Ausnahmen, Konstanten und Datenstrukturen. Im Allgemeinen sind die Ressourcen in einem Paket miteinander verknüpft und führen ähnliche Aufgaben aus.
Warum Pakete verwenden?
- Modularität
- Bessere Leistung / Funktionalität
Teile eines Pakets
Spezifikation - Wird manchmal als Paketkopf bezeichnet. Enthält Variablen- und Typdeklarationen sowie die Signaturen der Funktionen und Prozeduren im Paket, die öffentlich sind und von außerhalb des Pakets aufgerufen werden können.
Paketkörper - Enthält den Code und die privaten Deklarationen.
Die Paketspezifikation muss vor dem Pakettext kompiliert werden, andernfalls meldet die Pakettextkompilierung einen Fehler.
Überlastung
Funktionen und Prozeduren in Paketen können überlastet sein. Das folgende Paket TEST verfügt über zwei Prozeduren mit dem Namen print_number , die sich je nach den Parametern, mit denen sie aufgerufen werden , unterschiedlich verhalten.
create or replace package TEST is
procedure print_number(p_number in integer);
procedure print_number(p_number in varchar2);
end TEST;
/
create or replace package body TEST is
procedure print_number(p_number in integer) is
begin
dbms_output.put_line('Digit: ' || p_number);
end;
procedure print_number(p_number in varchar2) is
begin
dbms_output.put_line('String: ' || p_number);
end;
end TEST;
/
Wir nennen beide Verfahren. Der erste mit ganzzahligem Parameter, der zweite mit varchar2.
set serveroutput on;
-- call the first procedure
exec test.print_number(3);
-- call the second procedure
exec test.print_number('three');
Die Ausgabe des obigen Skripts lautet:
SQL>
Digit: 3
PL/SQL procedure successfully completed
String: three
PL/SQL procedure successfully completed
Einschränkungen beim Überladen
Nur lokale oder gepackte Unterprogramme oder Typmethoden können überladen werden. Daher können Sie keine eigenständigen Unterprogramme überladen. Sie können auch nicht zwei Unterprogramme überladen, wenn sich ihre Formalparameter nur im Namen- oder Parametermodus unterscheiden
Definieren Sie einen Paketkopf und -körper mit einer Funktion.
In diesem Beispiel definieren wir einen Paketkopf und einen Paketkörper mit einer Funktion.
Danach rufen wir eine Funktion aus dem Paket auf, die einen Rückgabewert zurückgibt.
Paketkopf :
CREATE OR REPLACE PACKAGE SkyPkg AS
FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
RETURN VARCHAR2;
END;
/
Paket körper :
CREATE OR REPLACE PACKAGE BODY SkyPkg AS
FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
RETURN VARCHAR2
AS
vColour VARCHAR2(100) := NULL;
BEGIN
IF vPlanet = 'Earth' THEN
vColour := 'Blue';
ELSIF vPlanet = 'Mars' THEN
vColour := 'Red';
END IF;
RETURN vColour;
END;
END;
/
Aufruf der Funktion aus dem Paketkörper :
DECLARE
vColour VARCHAR2(100);
BEGIN
vColour := SkyPkg.GetSkyColour(vPlanet => 'Earth');
DBMS_OUTPUT.PUT_LINE(vColour);
END;
/