Zum Inhalt springen

PL/SQL

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 13. April 2005 um 15:49 Uhr durch Udm (Diskussion | Beiträge) (Variablendefinitionen: Initialisierung ist optional, Typen, Typos). Sie kann sich erheblich von der aktuellen Version unterscheiden.

PL/SQL (Procedural Language/Structured Query Language) ist eine proprietäre Programmiersprache der Firma Oracle. PL/SQL-Programme werden von den relationalen Datenbanksystemen von Oracle serverseitig ausgeführt.

Sie verbindet die Geschwindigkeit von SQL Abfragen mit dem Komfort von prozeduralen Programmiersprachen.

Unterstützt werden Variablen, Bedingungen, Schleifen und Ausnahmen.

Ab Version 8 der Oracle-RDBMS halten auch objektorientierte Merkmale Einzug. Es ähnelt in der Syntax sehr der Programmiersprache Ada.

PL/SQL ist besonders für das Arbeiten mit Datenbanken ausgelegt. Insbesondere kann man im Quelltext SQL-Befehle nach dem Oracle-Standard einfügen. Dabei werden die SQL-Anweisungen nicht als Zeichenketten erzeugt und an eine Datenbankschnittstelle übergeben (wie z.B. bei ODBC, JDBC u.ä.), sondern fügen sich nahtlos in den Programmcode ein. Die Korrektheit der SQL-Statements kann somit schon durch Kompilieren verifiziert werden, zumindest wenn diese statisch, also nicht erst zur Laufzeit erzeugt sind.

Dies gilt jedoch ausschließlich für DML-Befehle, DDL und DCL müssen mit dbms_sql (einem PL/SQL-Package) oder mit der Syntax "execute immediate <befehl>" ausgeführt werden.


Verwendung

  • Man kann PL/SQL-Code wie SQL-Befehle über ein Datenbank-Frontend absetzen, der dann direkt abgearbeitet wird
  • Man kann einzelne Unterprogramme (Stored Procedures) oder Bibliotheken mehrerer Unterprogramme (Packages) als dauerhafte Datenbankobjekte auf dem Datenbankserver speichern und damit die Funktionalität der Datenbank erweitern; jeder Benutzer der Datenbank kann diese Unterprogramme aufrufen und nutzen. Die Berechtigungen können für jedes einzelne PL/SQL-Paket an einzelne Benutzer bzw. Benutzergruppen (sogenannte 'Rollen') vergeben werden.
  • Programmierung von Datenbanktriggern
  • Programmierung in diversen Tools (Oracle-Forms, Oracle-Reports)

Der Vorteil von PL/SQL ist, dass Programme direkt auf der Datenbank ausgeführt werden, was zu einem erheblichen Geschwindigkeitsvorteil führt.

Grundlegender Aufbau

PL/SQL Programme bestehen aus Blöcken:

declare
    -- Deklarationsblock
begin
   -- Eigentliches Programm
exception
   -- Exceptionsverarbeitung
end;
/* So kommentiert man
mehrzeilig */


--So kommentiert man einzeilig

Variablendefinitionen

Variablen werden im Deklarationsabschnitt definiert und optional initialisiert.

declare
    Zahl1 number(2);
    Zahl2 number(2) := 17;
    Text varchar(12) := 'Das ist ein Text';
begin
    select hausnummer into Zahl1 from Adressverzeichnis where name='Meier';
end;
:= ist der Zuweisungsoperator, mit dem man einer Variable einen Wert zuweist.

Zahlenvariablen

variablenname number(P[,S]) := Wert;

Um eine Zahlenvariable zu definieren, schreibt man den Variablennamen gefolgt vom Variablentyp "number".

Hinter diesem schreibt man in runden Klammern die Genauigkeit P sowie optional ein Komma und die Anzahl an Nachkommastellen S.

Genauigkeit entspricht in diesem Fall der Anzahl an Stellen, welche die Variable enthalten kann, und nicht dem Wertebereich.

Auswahl weiterer Datentypen für Zahlenvariablen:

dec, decimal, double precision, integer, int, numeric, real, smallint, binary_integer, pls_integer

Textvariablen

variablenname varchar(L) := 'Text';

Um eine Textvariable zu definieren, schreibt man den Variablennamen gefolgt vom Variablentyp "varchar2".

Hinter diesem schreibt man die Anzahl der Zeichen, die in der Variable gespeichert werden können, in Klammern.

Auswahl weiterer Datentypen für Textvariablen:

varchar, char, long, raw, long raw, nchar, nchar2

Boolean

variablenname boolean:= true;

Kann TRUE, FALSE oder NULL sein.

Datum

variablenname date := '01.01.2005';

Um eine Datumsvariable zu definieren schreibt man den Variablennamen gefolgt vom Variablentyp "date".

Damit man einen Text in ein Datum konvertieren kann, stellt Oracle die Funktion to_date zur Verfügung.

Diese Funktion wandelt den Text zwischen den ersten Hochkommas in ein Datum mit dem angegebenen Format zwischen den zweiten Hochkommas um.

Beispiel: "to_date('31.12.2004','dd.mm.yyyy'))"

Um ein Datum in einen Text zu konvertieren, gibt es die Funktion to_char(Datum).

Datentyp über Spalte festlegen

Variablenname Tabellenname.Spaltenname%type;


Definiert eine Variable des Typs der angegebenen Spalte.

Benutzerdefinierte Datentypen

Benutzerdefinierte Datentypen werden mit Hilfe von "type datentyp is record(feld1 typ1 :=xyz, feld2 typ2 :=xyz, ..., feldn typn :=xyz);" definiert.

declare
    type t_adresse is record(
        hausname adresse.hausname%type,
        strasse adresse.strasse%type,
        hausnummer adresse.hausnummer%type,
        postleitzahl adresse.postleitzahl%type);
    v_adresse t_adresse;
begin
    select hausname,strasse, hausnummer, postleitzahl into v_adresse from adresse where rownum = 1;
end;

Das Beispielprogramm definiert einen eigenen Datentyp mit Namen t_adresse welcher die Felder hausname, strasse, hausnummer und postleitzahl enthält.

Mit diesem Datentyp wird eine Variable v_adresse definiert, welche mit einem Datensatz aus der Tabelle adresse gefüllt wird.


Mittels Punktnotation kann auf die Attribute zurückgegriffen werden "v_adresse.hausname := 'Nollenburgerweg 115';"

Schleifen

Schleifen wiederholen die in ihrem Körper enthaltenen Anweisungen.

Loop-Schleife

loop
    ...
    exit when BEDINGUNG;
end loop;

Die loop-Schleife wiederholt die in ihrem Körper enthaltenen Anweisungen. Sie kann durch ein "exit when" gefolgt von einer Abbruchbedingung beendet werden.

Beachte: Auch wenn die Bedingung für das "exit" erfüllt sein sollte werden die Anweisungen im Schleifenkörper mindestens einmal ausgeführt.

While-Schleife

while Bedingung
    ...
end loop;

Die while-Schleife wiederholt die in ihrem Körper enthaltenen Anweisungen, so lange die Bedingung in ihrem Kopf erfüllt ist.


Beachte: Sollte die Bedingung im Kopf nicht erfüllt sein, werden die Anweisungen im Schleifenkörper nie ausgeführt.

For-Schleife

for v_counter in 1..10 loop
    ...
end loop;

Die for-Schleife zählt eine Indexvariable von einem festgelegten Startwert bis zu einem festgelegten Endwert. Der Startwert steht immer links, der Endwert immer rechts. Gibt man das Schlüsselwort REVERSE nach dem IN an, so wird vom größerem Wert zum kleineren Wert runtergezählt.

Beachte: Auch hierbei muss der größere Wert links und der kleinere Wert rechts stehen.

Bedingungen

Mit Hilfe von Bedingungen kann man auf verschiedene Situationen unterschiedlich reagieren.

If-Then-Else

declare
    v_land welt.land%type;
begin
    dbms_output.enable(20000);
    select land into v_land from welt
      where rownum = 1;
    if v_land = 39 then
        dbms_output.put_line('Land ist 39');
    elsif v_land = 49 then
        dbms_output.put_line('Land ist 49');
    else
        dbms_output.put_line('Land unbekannt');
    end if;
end;

If prüft ob eine Bedingung erfüllt ist. Ist diese Bedingung erfüllt werden die Anweisungen und Abfragen innerhalb des If-End if-Blocks ausgeführt, ansonsten werden diese übersprungen.Alternativ kann auch noch ein Elseif angegeben werden, welches alternativ, falls diese Bedingung erfüllt sein sollte, ausgeführt wird. Zu guter Letzt kann man ein allgemeines Else angeben, welches ausgeführt wird, wenn keine der vorangegangen Bedingungen erfüllt waren.

Select

Mit Hilfe von Selects ruft man Daten aus einer Datenbank ab:

select vorname,name,adresse from benutzer where id = 1028

Dieser Select liefert den Namen, Vornamen und die Adresse des Benutzers mit der id 1028.


Ein Select besteht immer aus:

select Spalte1, Spalte2, Spalte3,...,Spalten from Tabellenname where SpalteX = 'abc' and SpalteY = 123 or SpalteZ = 'xzy'

Mit Hilfe von Where gibt man Bedingungen an, um die Auswahl einzuschränken. Mit Hilfe von Or, Not oder And kann man diese noch verknüpfen.


Mittels

select land into v_land from welt where rownum= 1

kann man Daten aus einem Select in einer Variable speichern.

Insert

Mit Hilfe von Inserts speichert man Daten in einer Datenbank.


insert into adresse values('Müller','Feldweg','82','74414','Baumhausen')


Ein Insert besteht immer aus:

insert into Tabellenname values('Wert1','Wert2','Wert3',[..],'Wertn')

oder

insert into Tabellenname select xyz from 123 where xzy


Noch ein Beispiel:

insert into deutschland select * from england


Alle Daten aus England werden in Deutschland kopiert.

Update

Mit Hilfe von Update ändert man Daten in einer Datenbank:


update adresse set hausname = 'Kunz', strasse = 'Holzweg' where hausname = 'Müller'


Ein Update besteht immer aus:


update Tabellenname set Spalte1 = 'abc', Spalte2 = 123, [..], Spalten = 'xyz' where Spaltex = 'abc' and Spaltey = 321 or Spaltez = 123


Mit Hilfe von Where gibt man Bedingungen an, um das Update einzuschränken. Diese kann mit Hilfe von Or, Not oder And noch verknüpfen.

Vergleichbare Möglichkeiten der Programmierung bei anderen Datenbanken


Siehe auch: Applikationsserver, Embedded SQL