PL/SQL
PL/SQL (Procedural Language/Structured Query Language) ist eine proprietäre Programmiersprache der Firma Oracle. PL/SQL verbindet die Abfragesprache SQL mit einer prozeduralen Programmiersprache. Die Syntax ist stark an die Programmiersprache Ada angelehnt. Unterstützt werden Variablen, Bedingungen, Schleifen und Ausnahmebehandlungen. Ab Version 8 des Oracle-RDBMS halten auch objektorientierte Merkmale Einzug. PL/SQL ist für das Arbeiten mit Oracle-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 Syntax kann damit bereits zum Zeitpunkt der Kompilierung überprüft werden. Die prozedurale Erweiterung der SQL-Abfragesprache wird inzwischen auch von vielen anderen Datenbankherstellern implementiert. Daher wurde diese prozedurale SQL-Erweiterung inzwischen vom ANSI-Gremium standardisiert. Verwendung
PL/SQL-Programme können die Performance verbessern, wenn der Aufruf von einem Applikationsserver ausgeführt wird, der über eine langsame Netzwerkverbindung mit dem Datenbankserver verbunden ist. So muss in diesem Fall nur zu Beginn und am Ende der Ausführung eine Nachricht über das Netzwerk transportiert werden. Es gibt aber auch andere Möglichkeiten, bei einem langsamen Netzwerk die Performance einer Applikation zu verbessern. So kann z. B. die Oracle-Datenbank auch Java-Programme ausführen, die die Datenbank-Manipulationen vornehmen. Grundlegender AufbauPL/SQL-Programme bestehen aus Blöcken: declare
-- Deklarationsblock
begin
-- Ausführungsteil
exception
-- Ausnahmeverarbeitung
end;
/* So kommentiert man
mehrzeilig */
--So kommentiert man einzeilig
VariablendefinitionenVariablen werden im (optionalen) Deklarationsabschnitt definiert und optional initialisiert. declare
zahl1 number(2);
zahl2 number(2) := 17;
text varchar(20) := 'Das ist ein Text';
begin
select hausnummer into zahl1 from Adressverzeichnis where name='Meier' and rownum=1;
end;
Zahlenvariablen variablenname number(P[,S]) := Wert;
Um eine Zahlenvariable zu definieren, schreibt man zum Beispiel den Variablennamen, gefolgt vom Variablentyp Hinter diesem schreibt man in runden Klammern die Genauigkeit 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 varchar2(L) := 'Text';
Um eine Textvariable zu definieren, schreibt man den Variablennamen gefolgt vom Variablentyp Der angehängte Längenconstraint (Integer in Klammern) gibt die maximale Länge der Variablen in Bytes an (sofern die Length Semantic nicht auf CHAR gestellt ist) Auswahl weiterer Datentypen für Textvariablen: CHAR, NCHAR, NVARCHAR2, CLOB, NCLOB
Die Datentypen LONG, LONG RAW und VARCHAR sind deprecated Boolean variablenname boolean := true;
Kann Datum datum_1 date;
datum_2 date := to_date('31.12.2016', 'DD.MM.YYYY');
datum_3 date := to_date('31.12.2016 23:59:59', 'DD.MM.YYYY HH24:MI:SS');
datum_4 date := date '2016-12-31 ';
Variablen vom Typ Datentyp über Spalte festlegen Variablenname Tabellenname.Spaltenname%type;
Definiert eine Variable des Typs der angegebenen Spalte. Datentyp über Tabelle festlegen Variablenname Tabellenname%rowtype;
Definiert eine Variable für einen Datensatz/Row des Typs der angegebenen Tabelle. Beispiel: CURSOR cursor_name IS
SELECT *
FROM tabelle;
variable tabelle%rowtype;
...
FOR i IN cursor_name LOOP
variable := i;
andere_variable := variable.SPALTENNAME;
END LOOP;
Gültigkeitsbereich von VariablenPL/SQL erlaubt es, Blöcke zu verschachteln. Variablen, die in äußeren Blöcken deklariert werden, sind in allen inneren Blöcken gültig. Variablen, die in inneren Blöcken deklariert werden, sind nicht in äußeren Blöcken gültig. Je nachdem, wo Variablen deklariert werden, kann man zwischen zwei Arten unterscheiden.
In folgendem Beispiel werden zwei Variablen deklariert, und die Summe derer wird in einem inneren Block einer dritten Variable zugewiesen. Auf die Variablen DECLARE
var_num1 NUMBER;
var_num2 NUMBER;
BEGIN
var_num1 := 100;
var_num2 := 200;
DECLARE
var_result NUMBER;
BEGIN
var_result := var_num1 + var_num2;
END;
/* Auf var_result kann hier nicht zugegriffen werden */
END;
KonstantenEine Konstante ist ein Wert in einem PL/SQL Block, der sich während des Programmablaufes nicht verändert. DECLARE
konstantenname CONSTANT NUMBER(3) := 10;
Die Wertzuweisung einer Konstante muss direkt bei der Deklaration erfolgen. Benutzerdefinierte DatentypenBenutzerdefinierte Datentypen werden definiert mit Hilfe von: type datentyp is record(feld1 typ1 [:=xyz], feld2 typ2 [:=xyz], ..., feldn typn [:=xyz]);
Beispiel: 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 Mit diesem Datentyp wird eine Variable Mittels Punktnotation kann auf die Attribute zurückgegriffen werden v_adresse.hausname := 'Nollenburgerweg 115';
SchleifenSchleifen wiederholen die in ihrem Rumpf enthaltenen Anweisungen. Loop-Schleife (Basisschleife) loop
...
exit when BEDINGUNG;
end loop;
Die Beachte: Auch wenn die Bedingung für das While-Schleife while Bedingung loop
...
end loop;
Die 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 Beachte: Auch hierbei muss der kleinere Wert links und der größere Wert rechts stehen. begin
for i in reverse 1 .. 5 loop
dbms_output.put_line(to_char(i));
end loop;
end;
5
4
3
2
1
Hinweis: Wenn Sie beim Arbeiten mit SQL*Plus die erwarteten Zahlen 5 bis 1 nicht sehen, müssen Sie vorher die Ausgabe einschalten. set serveroutput on
Cursor-For-Schleife for Record-Index in (Select Mitarbeiter_Nummer from Personaltabelle)
loop
...
end loop;
Die Cursor Alternativ dazu kann das cursor cursor_mitarbeiter is
Select Mitarbeiter_Nummer from Personaltabelle;
for Record-Index in cursor_mitarbeiter
loop
...
end loop;
Der Zugriff auf die Mitarbeiter-Nummer innerhalb der Record-Index.Mitarbeiter_Nummer
BedingungenMit 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;
Bedingungsstrukturen kann man zudem mittels des CASE-WHEN DECLARE
v_land welt.land%TYPE;
BEGIN
DBMS_OUTPUT.enable(20000);
SELECT land INTO v_land FROM welt
WHERE ROWNUM = 1;
CASE WHEN v_land = 39 THEN DBMS_OUTPUT.put_line('Land ist 39');
WHEN v_land = 49 THEN DBMS_OUTPUT.put_line('Land ist 49');
WHEN v_land = 59 THEN DBMS_OUTPUT.put_line('Land ist 59');
ELSE DBMS_OUTPUT.put_line('Land unbekannt');
END CASE;
END;
Vereinfachte Form für reine Wertelisten: DECLARE
v_land welt.land%TYPE;
BEGIN
DBMS_OUTPUT.enable(20000);
SELECT land INTO v_land FROM welt
WHERE ROWNUM = 1;
CASE v_land
WHEN 39 THEN DBMS_OUTPUT.put_line('Land ist 39');
WHEN 49 THEN DBMS_OUTPUT.put_line('Land ist 49');
WHEN 59 THEN DBMS_OUTPUT.put_line('Land ist 59');
ELSE DBMS_OUTPUT.put_line('Land unbekannt');
END CASE;
END;
Exception-HandlingEs gibt zwei Arten von Exceptions:
deren Handling analog ist. Vordefinierte ExceptionsExceptions werden automatisch von PL/SQL ausgelöst, wenn Fehler bei der Arbeit mit Datenbankobjekten (Tabellen, Views, Packages u. ä.) oder Programmierfehler (bspw. Division durch Null) bei der Abarbeitung des Programms auftreten. Es gibt in PL/SQL 20 Exceptions mit vordefinierten Namen. Jede Exception hat einen Fehlercode, der aus den Buchstaben ORA- und 5 Ziffern besteht. Typische Exceptions dieser Art sind no_data_found (ORA-01403) – Eine SELECT-Anfrage liefert eine leere Datenmenge too_many_rows (ORA-01422) – Eine SELECT-Anfrage liefert eine Datenmenge mit mehr als einem Satz, an einer Stelle, an der nur ein einzelner Satz als Ergebnis der Anfrage erwartet wurde. Benutzerdefinierte ExceptionsFür die Behandlung logischer Programmfehler können eigene Exceptions in der Form <exception_name> exception;
pragma exception_init(<exception_name>, -<exception_number>);
definiert und durch das Kommando raise <exception_name>;
ausgelöst werden. ExceptionblockDer Exceptionblock dient dazu, alle Exceptions des dazugehörigen Ausführungsteiles abzufangen. Es besteht damit die Möglichkeit, nach einer Exception eine individuelle Fehlerbehandlung anzuschließen. Zum einen kann der Fehler nach dem Abfangen behandelt werden, danach kann im Programm weitergearbeitet werden; zum anderen kann die Exception an den umschließenden Block weitergereicht werden. Falls die Exception bis zum äußersten Block propagiert wird und dort keine entsprechende Fehlerbehandlung definiert wurde, führt dies zu einem unkontrollierten Abbruch des Programms. Der generelle Aufbau eines Exceptionblocks ist folgender: begin
-- Programmcode der eine Exception auslösen kann
Ausführungsteil
...
exception
when <exception_name_1> then
-- Exceptionbehandlung für die Exception <exception_name_1>
Ausführungsteil
...
when <exception_name_n> then
-- Exceptionbehandlung für die Exception <exception_name_n>
Ausführungsteil
when others then
-- Exceptionbehandlung für alle restlichen, nicht erwarteten Exceptions
Ausführungsteil
end;
Der Vergleich mit T-SQLPL/SQL ist trotz oberflächlicher Ähnlichkeiten grundsätzlich anders als Transact-SQL. Bei der Übernahme von Quellcode handelt es sich daher in der Regel um eine nicht ganz einfache Arbeit. Nicht nur auf Grund der Unterschiede in den Feature-Sets der beiden Sprachen,[1] sondern auch wegen der sehr deutlichen Unterschiede, wie Oracle und SQL Server mit der Steuerung der Parallelität und dem Locking umgehen. Es gibt jedoch Software-Tools, die die Übernahme erleichtern können, zum Beispiel Oracle Translation Scratch Editor[2] und SwisSQL.[3] Vergleichbare Möglichkeiten der Programmierung mit anderen Datenbank-Management-Systemen
WeblinksWikibooks: PL/SQL – Lern- und Lehrmaterialien
Einzelnachweise
|
Portal di Ensiklopedia Dunia