FirebirdSQL logo

Ein Paket ist eine Gruppe von Prozeduren und Funktionen, die als eine Einheit verwaltet werden.

CREATE PACKAGE

Verwendet für

Paket-Header deklarieren

Verfügbar in

DSQL

Syntax
CREATE PACKAGE package_name
[SQL SECURITY {INVOKER | DEFINER}]
AS
BEGIN
  [ <package_item> ... ]
END

<package_item> ::=
    <function_decl>;
  | <procedure_decl>;

<function_decl> ::=
  FUNCTION funcname [ ( [ <in_params> ] ) ]
  RETURNS <domain_or_non_array_type> [COLLATE collation]
  [DETERMINISTIC]

<procedure_decl> ::=
  PROCEDURE procname [ ( [ <in_params> ] ) ]
  [RETURNS (<out_params>)]

<in_params> ::= <inparam> [, <inparam> ... ]

<inparam> ::= <param_decl> [ { = | DEFAULT } <value> ]

<out_params> ::= <outparam> [, <outparam> ...]

<outparam> ::= <param_decl>

<value> ::= { literal | NULL | context_var }

<param-decl> ::= paramname <domain_or_non_array_type> [NOT NULL]
  [COLLATE collation]

<domain_or_non_array_type> ::=
  !! Siehe auch Skalardatentypen-Syntax !!
Table 1. CREATE PACKAGE-Anweisungsparameter
Parameter Beschreibung

package_name

Paketnamen.Die maximale Länge beträgt 63 Zeichen.Der Paketname muss unter allen Paketnamen eindeutig sein.

function_decl

Funktionsdeklaration

procedure_decl

Prozedurdeklaration

func_name

Funktionsname.Die maximale Länge beträgt 63 Zeichen.Der Funktionsname muss innerhalb des Pakets eindeutig sein.

proc_name

Prozedurname.Die maximale Länge beträgt 63 Zeichen.Der Funktionsname muss innerhalb des Pakets eindeutig sein.

collation

Sortierreihenfolge

inparam

Deklaration der Eingabeparameter

outparam

Deklaration der Ausgabeparameter

literal

Ein Literalwert, der mit dem Datentyp des Parameters zuweisungskompatibel ist

context_var

Jede Kontextvariable, die mit dem Datentyp des Parameters zuweisungskompatibel ist

paramname

Der Name eines Eingabeparameters einer Prozedur oder Funktion oder eines Ausgabeparameters einer Prozedur.Er kann aus bis zu 63 Zeichen bestehen.Der Name des Parameters muss unter den Eingabe- und Ausgabeparametern der Prozedur oder Funktion eindeutig sein.

Die Anweisung CREATE PACKAGE erstellt einen neuen Paket-Header.Im Paketheader deklarierte Routinen (Prozeduren und Funktionen) sind außerhalb des Pakets unter Verwendung des vollständigen Bezeichners (package_name.proc_name oder package_name.func_name) verfügbar.Routinen, die nur im Paketrumpf definiert sind – aber nicht im Paketkopf – sind außerhalb des Pakets nicht sichtbar.

Note
Paketprozedur- und Funktionsnamen können globale Routinen überschatten

Wenn ein Paketheader oder Paketrumpf eine Prozedur oder Funktion mit demselben Namen wie eine gespeicherte Prozedur oder Funktion im globalen Namespace deklariert, ist es nicht möglich, diese globale Prozedur oder Funktion aus dem Paketrumpf aufzurufen.In diesem Fall wird immer die Prozedur oder Funktion des Pakets aufgerufen.

Aus diesem Grund wird empfohlen, dass sich die Namen von gespeicherten Prozeduren und Funktionen in Paketen nicht mit Namen von gespeicherten Prozeduren und Funktionen im globalen Namespace überschneiden.

docnext count = 15

Statement-Terminatoren

Einige SQL-Anweisungseditoren – insbesondere das mit Firebird gelieferte Dienstprogramm isql und möglicherweise einige Editoren von Drittanbietern – verwenden eine interne Konvention, die erfordert, dass alle Anweisungen mit einem Semikolon abgeschlossen werden.Dies führt beim Codieren in diesen Umgebungen zu einem Konflikt mit der PSQL-Syntax.Wenn Sie dieses Problem und seine Lösung nicht kennen, lesen Sie bitte die Details im PSQL-Kapitel im Abschnitt Umschalten des Terminators in isql.

SQL-Sicherheit

Die SQL SECURITY-Klausel gibt den Sicherheitskontext zum Ausführen anderer Routinen oder zum Einfügen in andere Tabellen aus in diesem Paket definierten Funktionen oder Prozeduren an.Wenn SQL-Sicherheit nicht angegeben ist, wird der Standardwert der Datenbank zur Laufzeit angewendet.

Die SQL SECURITY-Klausel kann nur für das Paket angegeben werden, nicht für einzelne Prozeduren und Funktionen des Pakets.

Siehe auch SQL-Sicherheit im Kapitel Sicherheit.

Verfahrens- und Funktionsparameter

Ausführliche Informationen zu Parametern für gespeicherte Prozeduren finden Sie unter [fblangref40-ddl-proc-params-de] in [fblangref40-ddl-proc-create-de].

Einzelheiten zu Funktionsparametern finden Sie unter [fblangref40-ddl-func-params-de] in [fblangref40-ddl-func-create-de].

Wer kann ein Paket erstellen

Die CREATE PACKAGE-Anweisung kann ausgeführt werden durch:

Der Benutzer, der den Paketheader erstellt hat, wird sein Besitzer.

Beispiele für CREATE PACKAGE

  1. Erstellen Sie einen Paket-Header

CREATE PACKAGE APP_VAR
AS
BEGIN
  FUNCTION GET_DATEBEGIN() RETURNS DATE DETERMINISTIC;
  FUNCTION GET_DATEEND() RETURNS DATE DETERMINISTIC;
  PROCEDURE SET_DATERANGE(ADATEBEGIN DATE,
      ADATEEND DATE DEFAULT CURRENT_DATE);
END
  1. Wenn DEFINER für das Paket pk gesetzt ist, benötigt der Benutzer US nur das EXECUTE-Privileg auf pk.Wenn es auf INVOKER gesetzt wäre, bräuchte entweder der Benutzer oder das Paket auch das INSERT-Privileg für die Tabelle t.

    create table t (i integer);
    set term ^;
    create package pk SQL SECURITY DEFINER
    as
    begin
        function f(i integer) returns int;
    end^
    
    create package body pk
    as
    begin
        function f(i integer) returns int
        as
        begin
          insert into t values (:i);
          return i + 1;
        end
    end^
    set term ;^
    grant execute on package pk to user us;
    
    commit;
    
    connect 'localhost:/tmp/69.fdb' user us password 'pas';
    select pk.f(3) from rdb$database;

ALTER PACKAGE

Verwendet für

Ändern des Paketheaders

Verfügbar in

DSQL

Syntax
ALTER PACKAGE package_name
[SQL SECURITY {INVOKER | DEFINER}]
AS
BEGIN
  [ <package_item> ... ]
END

!! Vgl. Syntax CREATE PACKAGE für weitere Regeln!!

Die ALTER PACKAGE-Anweisung modifiziert den Paket-Header.Es kann verwendet werden, um die Anzahl und Definition von Prozeduren und Funktionen einschließlich ihrer Ein- und Ausgabeparameter zu ändern.Der Quelltext und die kompilierte Form des Paketkörpers werden jedoch beibehalten, obwohl der Körper nach der Änderung des Paketheaders möglicherweise inkompatibel ist.Die Gültigkeit eines Paketkörpers für den definierten Header wird in der Spalte RDB$PACKAGES.RDB$VALID_BODY_FLAG gespeichert.

Wenn Sie ein Paket ändern, ohne die SQL SECURITY-Klausel anzugeben, wird die SQL-Sicherheitseigenschaft entfernt, wenn sie derzeit für dieses Paket festgelegt ist.Dies bedeutet, dass das Verhalten auf den Datenbankstandard zurückgesetzt wird.

Wer kann ein Paket ändern

Die ALTER PACKAGE-Anweisung kann ausgeführt werden durch:

  • Administratoren

  • Der Besitzer des Pakets

  • Benutzer mit der Berechtigung ALTER ANY PACKAGE

Beispiel für ALTER PACKAGE

Ändern eines Paketheaders
ALTER PACKAGE APP_VAR
AS
BEGIN
  FUNCTION GET_DATEBEGIN() RETURNS DATE DETERMINISTIC;
  FUNCTION GET_DATEEND() RETURNS DATE DETERMINISTIC;
  PROCEDURE SET_DATERANGE(ADATEBEGIN DATE,
      ADATEEND DATE DEFAULT CURRENT_DATE);
END

CREATE OR ALTER PACKAGE

Verwendet für

Erstellen eines neuen oder Ändern eines bestehenden Paket-Headers

Verfügbar in

DSQL

Syntax
CREATE OR ALTER PACKAGE package_name
[SQL SECURITY {INVOKER | DEFINER}]
AS
BEGIN
  [ <package_item> ... ]
END

!! Siehe auch Syntax CREATE PACKAGE für weitere Regeln!!

Die Anweisung CREATE OR ALTER PACKAGE erstellt ein neues Paket oder ändert einen vorhandenen Paket-Header.Existiert der Paket-Header nicht, wird er mit CREATE PACKAGE erstellt.Wenn es bereits existiert, wird es mit ALTER PACKAGE modifiziert, während bestehende Privilegien und Abhängigkeiten beibehalten werden.

Beispiel für CREATE OR ALTER PACKAGE

Erstellen eines neuen oder Ändern eines vorhandenen Paketheaders
CREATE OR ALTER PACKAGE APP_VAR
AS
BEGIN
  FUNCTION GET_DATEBEGIN() RETURNS DATE DETERMINISTIC;
  FUNCTION GET_DATEEND() RETURNS DATE DETERMINISTIC;
  PROCEDURE SET_DATERANGE(ADATEBEGIN DATE,
      ADATEEND DATE DEFAULT CURRENT_DATE);
END

DROP PACKAGE

Verwendet für

Einen Paket-Header löschen

Verfügbar in

DSQL

Syntax
DROP PACKAGE package_name
Table 1. DROP PACKAGE-Anweisungsparameter
Parameter Beschreibung

package_name

Paketname

Die DROP PACKAGE-Anweisung löscht einen vorhandenen Paket-Header.Wenn ein Paketkörper vorhanden ist, wird er zusammen mit dem Paketkopf gelöscht.Wenn noch Abhängigkeiten vom Paket bestehen, wird ein Fehler ausgegeben.

Wer kann ein Paket abgeben

Die DROP PACKAGE-Anweisung kann ausgeführt werden durch:

  • Administratoren

  • Der Besitzer des Pakets

  • Benutzer mit der Berechtigung DROP ANY PACKAGE

Beispiel für DROP PACKAGE

Einen Paket-Header löschen
DROP PACKAGE APP_VAR

RECREATE PACKAGE

Verwendet für

Erstellen eines neuen oder erneuten Erstellens eines vorhandenen Paketheaders

Verfügbar in

DSQL

Syntax
RECREATE PACKAGE package_name
[SQL SECURITY {INVOKER | DEFINER}]
AS
BEGIN
  [ <package_item> ... ]
END

!! Siehe auch Syntax CREATE PACKAGE für weitere Regeln!!

Die Anweisung RECREATE PACKAGE erstellt ein neues Paket oder erstellt einen vorhandenen Paket-Header neu.Wenn bereits ein Paketheader mit demselben Namen vorhanden ist, wird dieser durch diese Anweisung zuerst gelöscht und dann ein neuer Paketheader erstellt.Es ist nicht möglich, den Paketheader neu zu erstellen, wenn noch Abhängigkeiten von dem vorhandenen Paket bestehen oder wenn der Hauptteil des Pakets vorhanden ist.Bestehende Privilegien des Pakets selbst werden nicht beibehalten, ebenso wenig Privilegien zum Ausführen der Prozeduren oder Funktionen des Pakets.

Beispiel für RECREATE PACKAGE

Erstellen eines neuen oder erneuten Erstellens eines vorhandenen Paketheaders
RECREATE PACKAGE APP_VAR
AS
BEGIN
  FUNCTION GET_DATEBEGIN() RETURNS DATE DETERMINISTIC;
  FUNCTION GET_DATEEND() RETURNS DATE DETERMINISTIC;
  PROCEDURE SET_DATERANGE(ADATEBEGIN DATE,
      ADATEEND DATE DEFAULT CURRENT_DATE);
END