Benannte Blöcke (stored objects)

In den vorhergehenden Kapiteln haben wir die grundlegenden Sprachelemente und ihre Verhaltensweisen kennen gelernt. Wenden wir uns nun den auf Datenbankseite abgelegten PL/SQL Programmen zu, den sogenannten Stored Procedures, Stored Functions und Stored Packages.

Bis jetzt mussten wir unseren Code für die Ausführung immer wieder erneut zum Server schicken, unsere Programme existierten auf Serverseite nur für die Dauer ihrer Ausführung. Viele Entwickler halten die Eigenschaft, PL/SQL Programme auf Datenbankseite dauerhaft ablegen zu können, für den wichtigsten Vorzug der Nutzung von PL/SQL.

Modularisierung

Wir nutzen Packages, Procedures und Functions in PL/SQL, um große Anwendungen und ihre Einzelteile zu modularisieren.

Modularisierter Code ist gut, denn das bedeutet

  • Höhere Wiederverwendbarkeit. Wir nutzen Lösungen für allgemeingültige Aufgaben in veschiedenen Applikationen.
  • Verbesserte Wartbarkeit. Tests und Korrekturen sind einfacher als bei großen Programmeinheiten
  • Vereinfachte Entwicklung. Wir sind in der Lage, unsere Gesamtapplikation in kleine, leicht verwaltbare Teilaufgaben zu zerlegen.
  • Erhöhte Sicherheit. Durch das Speichern des Codes auf Datebankseite erreichen wir eine weitaus höhere Sicherheit, denn zum einen sind unsere Programme nun in den datenbankeigenen Backup- und Recoverymechanismus eingebunden, gleichzeitig sind Aspekte wie Zugriffsschutz und Softwareverteilung über SQL-eigene Mechanismen möglich.

Unterschiede zwischen Package, Procedure und Function

Eine Prozedur ist ein benannter PL/SQL block. Wir kommunizieren mit ihm über eine Parameterliste, die sowohl die Eingabewerte, aber auch Ausgabewerte enthält. Prozeduren sind ausführbar und müssen daher mindestens auch eine ausführbare Anweisung enthalten.

Eine Funktion ist ebenfalls ein benannter PL/SQL Block, wird aber benutzt wie ein Ausdruck. Eine Funktion liefert einen Wert zurück, der i.d.R. einer Variablen zugewiesen wird. Argumente werden der Funktion ebenfalls mit einer Parameterliste übergeben. Neben dem Rückgabewert können Funktionen genau wie Prozeduren die übergebenen Argumente verändern.

Eine Package ist eine benannte Sammlung von Prozeduren und Funktionen, aber auch von Ausnahmen, Datentypen, Variablen. Packages haben im Gegensatz zu Prozeduren und Funktionen einen Zustand, da bspw. Variablenwerte nicht nach Ende einer Prozedur flüchtig sind, sondern bis zum Ende der Nutzersitzung erhalten bleiben. Packages werden wir später viel Aufmerksamkeit schenken.

All diese Module haben eine identische Blockstruktur. Entgegen der Blockstruktur eines anonymen Blocks kommt hier eine Sektion hinzu: Der Header.
Diese Sektion existiert nur in benannten Blöcken. Der Header bestimmt, wie der Block aufgerufen werden kann. Er enthält den Namen des Blocks, seine Parameterliste und –falls es sich um eine Funktion handelt- den Datentyp des Rückgabewertes.

Der Deklarationsabschnitt, wie wir ihn aus anonymen Blöcken kennen, existiert natürlich noch immer, wird aber nicht mehr explizit mit DECLARE eingeleitet. Variablen- und Typdeklaration folgen sofort auf den Headerabschnitt bis zum Beginn des ausführbaren Teils, der wie gewohnt mit BEGIN eingeleitet wird.

In unserem Beispiel wollen wir eine Tabelle erzeugen namens plsql15_Test. Die Tabelle soll aus zwei Spalten bestehen:

Create table plsql15_test
  (id number(12),
   enter_date date); 

Unsere Tabelle soll mit 1000 Datensätzen gefüllt werden mit Hilfe eines anonymen PL/SQL Blocks. Danach füllen wir sie mit weiteren 1000 Datensätzen mit Hilfe eines benannten PL/SQL Blocks (Prozedur).

Der anonyme Block ist folgender

declare
  i number := 0;
begin
  loop
    i := i + 1;
    insert into plsql15_test
      (id, enter_date)
    values
      (i, sysdate);
    exit when i = 1000;
  end loop;
end; 

Wenn Sie den Code ausführen, sollten die ersten 1000 Datensätze in Ihrer Tabelle stehen.

Jetzt packen wir unseren Code in einen PL/SQL Block (Prozedur).

Create or replace procedure load_plsql15 is
    i number := 0;
  begin
    loop
      i := i + 1;
      insert into plsql15_test
        (id, enter_date)
      values
        (i, sysdate);
      exit when i = 1000;
    end loop;
  end load_plsql15;
/ 

Wenn wir diesen Code ausführen, antwortet ORACLE wie folgt.

Procedure created. 

Das Anlegen der Prozedur hat aber noch nicht zum Ausführen des Codes geführt. Unser Code ist jetzt dauerhaft in der Datenbank abgelegt.

Um die Prozedur auszuführen, gibt es zwei Methoden. Entweder wir rufen die Prozedur vom SQL-Prompt auf mit

SQL>execute load_plsql15

Alternativ können wir die Prozedur aus einem anderen (auch anonymen) PLSQL Block aufrufen.

begin
  load_plsql15;
end;
/ 

Haben Sie beide Varianten ausprobiert, haben wir jetzt also insgesamt 3000 Datensätze in der Tabelle.

Benannte Blöcke sind komplett in die Transaktion des Benutzers eingebettet. Alles was ein benannter Block verändert, kann also nach Ausführung zurückgenommen werden (Rollback).
In einem PL/SQL-Block, egal ob benannt oder anonym, ist aber auch die Transaktionssteuerung erlaubt: Der Block kann also auch committen und rollbacken, so daß die durch ihn durchgeführten Veränderungen persistent sind. Bedenken Sie dies beim Experimentieren…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert