PL/SQL - Kurze Einführung - PL/SQL • .. ist eine Oracle-eigene, prozedurale Programmiersprache • Sämtliche bekannten Konzepte können verwendet werden: Funktionen/ Prozeduren, Abfragen/bedingte Ausführung, Schleifen, etc. 23. April 2003 Übung Data Warehousing: PL/SQL 2 Programmdateien • Programme können in Dateien abgelegt werden • Ausführung eines Programmes in SQL*Plus: „@tolles_programm{.sql}“ • Programmdateien müssen mit einer Leerzeile enden 23. April 2003 Übung Data Warehousing: PL/SQL 3 PL/SQL-Programme • .. bestehen aus Blöcken, welche ineinander verschachtelt sein können: DECLARE .. /* Variablen-&Typdeklarationen */ BEGIN .. /* Programmcode, Funktionen .. */ EXCEPTION .. /* Exception-Handling */ END; 23. April 2003 Übung Data Warehousing: PL/SQL 4 SQL in PL/SQL • Erlaubte SQL-Statements: – select, insert, delete, update + Transaktionen • Nicht (direkt) erlaubt – create, drop, alter • SELECT hat eine eigene, abgewandelte Form: select <attribut> into <variable> from <tabelle> where <bedingung>; 23. April 2003 Übung Data Warehousing: PL/SQL 5 Variablen und Datentypen • Alle von Oracle unterstützen Typen + NUMBER, BOOLEAN • Ermittlung zur Laufzeit möglich DECLARE name VARCHAR(20); gruppe NUMBER; punktezahl Gruppen.punkte%TYPE; 23. April 2003 Übung Data Warehousing: PL/SQL 6 Zuweisungen & SQL DECLARE gruppe Gruppen.name%TYPE; punktezahl Gruppen.punkte%TYPE; BEGIN SELECT name,punkte INTO gruppe, punktezahl FROM Gruppen WHERE punkte <= 10 FOR UPDATE; punktezahl := punktezahl + 1; INSERT INTO Gruppen VALUES (gruppe, punktezahl); END; 23. April 2003 Übung Data Warehousing: PL/SQL 7 Kontrollflüsse • LOOP EXIT WHEN <B> ... END LOOP; • WHILE <B> LOOP ... END LOOP; • FOR <V> IN <C>..<C2> LOOP ... END LOOP; • IF <B> THEN ... ELSIF <B2> THEN ... ELSE ... END IF; 23. April 2003 Übung Data Warehousing: PL/SQL 8 Cursor .. • Problem bei erwähnten Zuweisungen von Tabellenwerten: funktioniert nur bei single-rowselect, d.h. wenn ein einzelnes Tupel zurückgeliefert wird • Abhilfe: die sogenannten Cursor • sie arbeiten sämtliche Tupel aus dem Ergebnis nacheinander ab 23. April 2003 Übung Data Warehousing: PL/SQL 9 .. Cursor .. DECLARE CURSOR GruppenCursor IS SELECT name,punkte FROM Gruppen WHERE punkte <= 10 FOR UPDATE; BEGIN OPEN Gruppencursor; LOOP 23. April 2003 Übung Data Warehousing: PL/SQL 10 .. Cursor FETCH GruppenCursor INTO gruppe,punktezahl; EXIT WHEN GruppenCursor%NOTFOUND; punktezahl := punktezahl * 2; DELETE FROM Gruppen WHERE CURRENT OF GruppenCursor; INSERT INTO Gruppen VALUES (gruppe,punktezahl); END LOOP; CLOSE GruppenCursor; END; 23. April 2003 Übung Data Warehousing: PL/SQL 11 Prozeduren & Funktionen CREATE PROCEDURE GruppeEinfuegen( gruppe Gruppen.name%TYPE, punktezahl Gruppen.punkte%TYPE) AS BEGIN /* .. */ END GruppeEinfuegen; BEGIN /* Hauptprogramm */ /* .. */ GruppeEinfuegen('group1',0); /* .. */ END; 23. April 2003 Übung Data Warehousing: PL/SQL 12 Prozeduren & Funktionen • Wie Prozeduren, Rückgabe über return <wert>; • select object_type, object_name from user_objects where object_type = 'PROCEDURE' or object_type = 'FUNCTION'; • drop function <funktions_name>; • CREATE OR REPLACE PROCEDURE .. ; 23. April 2003 Übung Data Warehousing: PL/SQL 13 Fehlermeldungen • Fehlermeldungen sind i.d.R. leider wenig aussagekräftig • genauere Beschreibung über show errors procedure <name>; • Anzeige des letzten Fehlers: SHO ERR; • Positionsangaben oft ungenau! 23. April 2003 Übung Data Warehousing: PL/SQL 14