180 likes | 345 Views
PL/SQL. - Kurze Einführung -. Was fehlt noch?. Konzept einer PL/SQL-Sprache in DB ausführlicher PL/SQL und Ablauf Konkrete Beispiele. PL/SQL. .. ist eine Oracle-eigene, prozedurale Programmiersprache
E N D
PL/SQL - Kurze Einführung -
Was fehlt noch? • Konzept einer PL/SQL-Sprache in DB ausführlicher • PL/SQL und Ablauf • Konkrete Beispiele Übung Data Warehousing: PL/SQL
PL/SQL • .. ist eine Oracle-eigene, prozedurale Programmiersprache • Sämtliche bekannten Konzepte können verwendet werden: Funktionen/ Prozeduren, Abfragen/bedingte Ausführung, Schleifen, etc. Übung Data Warehousing: PL/SQL
Konzept • Tight integration • DDL / DML: einfach & effizient • Stored procedures • Verwendung in SQL Statements • dynamisches SQL • Security • Kein direkter Zugriff durch Clients • User benutzen stored procedures Übung Data Warehousing: PL/SQL
Programmdateien • Programme können in Dateien abgelegt werden • Ausführung eines Programmes in SQL*Plus: „@meinprogramm{.sql}“ • Programmdateien müssen mit einer Leerzeile enden Übung Data Warehousing: PL/SQL
PL/SQL-Programme • .. bestehen aus Blöcken, welche ineinander verschachtelt sein können: DECLARE .. /* Variablen-&Typdeklarationen */ BEGIN .. /* Programmcode, Funktionen .. */ EXCEPTION .. /* Exception-Handling */ END; Übung Data Warehousing: PL/SQL
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>; Übung Data Warehousing: PL/SQL
Variablen und Datentypen • Alle von Oracle unterstützen Typen + NUMBER, BOOLEAN • Ermittlung zur Compilezeit möglich DECLARE name VARCHAR(20); gruppe NUMBER; punktezahl Gruppen.punkte%TYPE; Übung Data Warehousing: PL/SQL
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; Übung Data Warehousing: PL/SQL
Kontrollflüsse • LOOP EXIT WHEN <B> ... END LOOP; • WHILE <B> LOOP ... END LOOP; • FOR <V> IN <C1>..<C2> LOOP ... END LOOP; • IF <B> THEN ... ELSIF <B2> THEN ... ELSE ... END IF; Übung Data Warehousing: PL/SQL
Cursor .. • Problem bei erwähnten Zuweisungen von Tabellenwerten: funktioniert nur bei single-row- select • Abhilfe: die sogenannten Cursor • arbeiten sämtliche Tupel aus dem Ergebnis nacheinander ab Übung Data Warehousing: PL/SQL
.. Cursor .. DECLARE CURSOR GruppenCursor IS SELECT name,punkte FROM Gruppen WHERE punkte <= 10 FOR UPDATE; BEGIN OPEN Gruppencursor; <do something> CLOSE GruppenCursor; END; Übung Data Warehousing: PL/SQL
.. Cursor LOOP 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; Übung Data Warehousing: PL/SQL
Prozeduren & Funktionen CREATE PROCEDURE GruppeEinfuegen( gruppe Gruppen.name%TYPE, punktezahl Gruppen.punkte%TYPE) AS BEGIN /* .. */ END GruppeEinfuegen; /* Hauptprogramm */ BEGIN /* .. */ GruppeEinfuegen('group1',0); /* .. */ END; Übung Data Warehousing: PL/SQL
Prozeduren & Funktionen CREATE FUNCTION Quadriere(zahl NUMBER) RETURN NUMBER AS DECLARE q NUMBER; BEGIN q := zahl * zahl; RETURN zahl; END Quadriere; /* Hauptprogramm */ DECLARE r NUMBER; BEGIN r := Quadriere(7); END; Übung Data Warehousing: PL/SQL
Prozeduren & Funktionen • Anzeige aller Procedures/Functions: select object_type, object_name from user_objects where object_type = 'PROCEDURE' or object_type = 'FUNCTION'; • Löschen einer Procedure/Function: drop function <funktions_name>; • Überschreiben: CREATE OR REPLACE PROCEDURE .. ; Übung Data Warehousing: PL/SQL
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! Übung Data Warehousing: PL/SQL
Beispiel DECLARE qty_on_hand NUMBER(5); BEGIN SELECT quantity INTO qty_on_hand FROM inventory WHERE product = 'TENNIS RACKET'‚ FOR UPDATE OF quantity; IF qty_on_hand > 0 THEN UPDATE inventory SET quantity = quantity – 1 WHERE product = 'TENNIS RACKET'; INSERT INTO purchase_record VALUES ('Tennis racket purchased', SYSDATE); ELSE INSERT INTO purchase_record VALUES ('Out of tennis rackets', SYSDATE); END IF; COMMIT; END; Übung Data Warehousing: PL/SQL