PL/SQL
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
- PL/pgSQL in der Open-Source-Datenbank PostgreSQL.
- SQL-PL für Adabas
- Transact SQL (TSQL) ist die entsprechende Programmiersprache für RDBMS von Sybase und Microsoft
Siehe auch: Applikationsserver, Embedded SQL
Weblinks
- Oracle PL/SQL Users Guide
- Tutorial für PL/SQL
- Tutorial für PL/SQL auf Deutsch
- Oracle FAQ: knowledge base PL/SQL