PL/SQL

Werbung
PL/SQL
- Kurze Einführung -
Was fehlt noch?
• Konzept einer PL/SQL-Sprache in
DB ausführlicher
• PL/SQL und Ablauf
• Konkrete Beispiele
15. April 2004
Übung Data Warehousing:
PL/SQL
2
PL/SQL
• .. ist eine Oracle-eigene,
prozedurale Programmiersprache
• Sämtliche bekannten Konzepte
können verwendet werden:
Funktionen/ Prozeduren,
Abfragen/bedingte Ausführung,
Schleifen, etc.
15. April 2004
Übung Data Warehousing:
PL/SQL
3
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
15. April 2004
Übung Data Warehousing:
PL/SQL
4
Programmdateien
• Programme können in Dateien
abgelegt werden
• Ausführung eines Programmes in
SQL*Plus:
„@meinprogramm{.sql}“
• Programmdateien müssen mit
einer Leerzeile enden
15. April 2004
Übung Data Warehousing:
PL/SQL
5
PL/SQL-Programme
• .. bestehen aus Blöcken, welche
ineinander verschachtelt sein können:
DECLARE
.. /* Variablen-&Typdeklarationen */
BEGIN
.. /* Programmcode, Funktionen .. */
EXCEPTION
.. /* Exception-Handling */
END;
15. April 2004
Übung Data Warehousing:
PL/SQL
6
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>;
15. April 2004
Übung Data Warehousing:
PL/SQL
7
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;
15. April 2004
Übung Data Warehousing:
PL/SQL
8
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;
15. April 2004
Übung Data Warehousing:
PL/SQL
9
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;
15. April 2004
Übung Data Warehousing:
PL/SQL
10
Cursor ..
• Problem bei erwähnten
Zuweisungen von Tabellenwerten:
funktioniert nur bei single-rowselect
• Abhilfe: die sogenannten Cursor
• arbeiten sämtliche Tupel aus dem
Ergebnis nacheinander ab
15. April 2004
Übung Data Warehousing:
PL/SQL
11
.. Cursor ..
DECLARE
CURSOR GruppenCursor IS
SELECT name,punkte
FROM Gruppen WHERE punkte <= 10
FOR UPDATE;
BEGIN
OPEN Gruppencursor;
<do something>
CLOSE GruppenCursor;
END;
15. April 2004
Übung Data Warehousing:
PL/SQL
12
.. 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;
15. April 2004
Übung Data Warehousing:
PL/SQL
13
Prozeduren & Funktionen
CREATE PROCEDURE GruppeEinfuegen(
gruppe
Gruppen.name%TYPE,
punktezahl Gruppen.punkte%TYPE) AS
BEGIN
/* .. */
END GruppeEinfuegen;
/* Hauptprogramm */
BEGIN
/* .. */
GruppeEinfuegen('group1',0);
/* .. */
END;
15. April 2004
Übung Data Warehousing:
PL/SQL
14
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;
15. April 2004
Übung Data Warehousing:
PL/SQL
15
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 .. ;
15. April 2004
Übung Data Warehousing:
PL/SQL
16
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!
15. April 2004
Übung Data Warehousing:
PL/SQL
17
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;
15. April 2004
Übung Data Warehousing:
PL/SQL
18
Herunterladen