Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Dr. Heidrun BethgePL/SQL1 procedural language / structured query language.

Ähnliche Präsentationen


Präsentation zum Thema: "Dr. Heidrun BethgePL/SQL1 procedural language / structured query language."—  Präsentation transkript:

1 Dr. Heidrun BethgePL/SQL1 procedural language / structured query language

2 Dr. Heidrun BethgePL/SQL2 Agenda Was ist PL/SQL? PL/SQL Blöcke Datentypen Kontrollstrukturen Datenbankstrukturen / Cursor Prozeduren und Funktionen Fehlerbehandlung

3 Dr. Heidrun BethgePL/SQL3 Literatur Oracle Database PL/SQL Language Reference Oracle pdf Dokument auch Quelle für einige Beispiele

4 Dr. Heidrun BethgePL/SQL4 Was ist PL/SQL? Oracles Programmiersprache für Stored Procedures Erweiterung des SQL-Potentials Integration in Oracle-Datenbankserver Beinhaltet die Funktionalität einer modernen Programmiersprache: –Variablendeklaration –Schleifen und andere logische Strukturen –Fehlerbehandlung –Modularität –Kapselung –etc.

5 Dr. Heidrun BethgePL/SQL5 Vorteile von PL/SQL PL/SQL ist sehr einfach zu lernen: große Ähnlichkeit zu bekannten Programmiersprachen PL/SQL-Programm wird in der Oracle Datenbank gespeichert: Ein PL/SQL-Programm kann von jedem Datenbankbenutzer mit entsprechenden Rechten genutzt werden. Keine Verbreitung des Programms an Clients notwendig. PL/SQL insbesondere für Bearbeitung großer Datenmengen geeignet

6 Dr. Heidrun BethgePL/SQL6 Bessere Performanz Ein PL/SQL-Programm kann mehrere SQL- Befehle zu einer Einheit zusammenfassen. Dies ist insbesondere für Transaktionen von Vorteil. Die Befehle müssen nicht zum Datenbanksystem transferiert werden, da sie bereits dort gespeichert sind. So entsteht weniger Netzwerkverkehr und die Performanz von Anwendungen wird erhöht.

7 Dr. Heidrun BethgePL/SQL7 Enge Integration mit SQL In PL/SQL direkt nutzbar: select, insert, update, delete und Transaktionsverwaltung Syntax von SQL-Befehlen ist in PL/SQL identisch (Ausnahme: select) Schreiben von SQL-Ergebnis in Variable: select into from where ; PL/SQL hat die gleichen Datentypen wie Oracle-Tabellen -> keine Typkonvertierung notwendig. (Es gibt auch eigene PL/SQL- Typen.)

8 Dr. Heidrun BethgePL/SQL8 Was ist PL/SQL? PL/SQL Blöcke Datentypen Kontrollstrukturen Datenbankstrukturen / Cursor Prozeduren und Funktionen Fehlerbehandlung

9 Dr. Heidrun BethgePL/SQL9 Blockstruktur von PL/SQL Die Grundeinheit jedes PL/SQL-Programms ist der Block. Jedes PL/SQL-Programm besteht –entweder aus einem einzelnen Block –oder aus mehreren aufeinander folgenden Blöcken –oder aus ineinander geschachtelten Blöcken [DECLARE -- Deklarationsteil] BEGIN -- Ausführungsteil [EXCEPTION -- Fehlerbehandlungsteil] END;( nicht das Semikolon am Ende vergessen!) / (Ausführung des PL/SQL-Programms)

10 Dr. Heidrun BethgePL/SQL10 2 Typen von Blöcken Es gibt zwei Arten von Blöcken: Anonyme Blöcke werden nicht gespeichert und nur einmal ausgeführt. Sie sind eine Art komplexer SQL-Befehl. Benannte Blöcke sind mit Namen versehen und werden in der Datenbank dauerhaft gespeichert. Sie können immer wieder ausgeführt werden. Typen benannter Blöcke sind: –Prozeduren –Funktionen –Trigger

11 Dr. Heidrun BethgePL/SQL11 anonymer Block: Beispiele BEGIN DBMS_OUTPUT.PUT_LINE('Hallo Welt'); END; _______________________________________ DECLARE heute DATE; BEGIN heute:=SYSDATE; DBMS_OUTPUT.PUT_LINE('Heute: ' || heute); END;

12 Dr. Heidrun BethgePL/SQL12 Ausführung von SQL-Befehlen in PL/SQL In PL/SQL direkt nutzbar: select, insert, update, delete und Transaktionsverwaltung SQL-Befehle werden in PL/SQL exakt so eingegeben, wie sie z.B. von SQL Plus aus verwendet werden. Es ist kein Unterschied in der Verwendung von SQL innerhalb von PL/SQL oder außerhalb vorhanden. (außer SELECT.. INTO) BEGIN INSERT INTO departments VALUES (400,'abc',NULL,NULL); COMMIT; END;

13 Dr. Heidrun BethgePL/SQL13 Syntax – ein paar Besonderheiten unabhängig von Groß- und Kleinschreibung jede Anweisung wird durch Semikolon abgeschlossen: ; Anweisung kann über mehrere Zeilen gehen. Verkettung von Zeichenketten: || 'Hans' || 'Mustermann' Kommentare: o/* */ : Mehrzeilenkommentare o-- bis zum Ende der Zeile / (= run) am Ende von PL/SQL bewirkt die direkte Ausführung

14 Dr. Heidrun BethgePL/SQL14 Was ist PL/SQL? PL/SQL Blöcke Datentypen Kontrollstrukturen Datenbankstrukturen / Cursor Prozeduren und Funktionen Fehlerbehandlung

15 Dr. Heidrun BethgePL/SQL15 Datentypen alle in Oracle-SQL verfügbaren Datentypen. Z.B. CHAR, DATE oder NUMBER Vorteil: Datentypenkonvertierung zwischen SQL und Programmierung nicht erforderlich Spezielle PL/SQL-Datentypen. Z.B. BOOLEAN oder BINARY_INTEGER selbstdefinierte Unterdatentypen

16 Dr. Heidrun BethgePL/SQL16 PL/SQL-Datentypen Skalar: enthält einzelnen Wert. Z.B. BINARY_INTEGER, BOOLEAN Zusammengesetzt: Z.B. RECORD, TABLE, VARRAY LOB (Location of large Objects): z.B. Textblöcke oder Bilder: z.B. BFILE, BLOB Referenz: enthält Pointer. Z.B. REF CURSORS, OBJECT TYPES

17 Dr. Heidrun BethgePL/SQL17 Skalare Datentypen Skalare SQL-Datentypen: VARCHAR2 CHAR DATE LONG NUMBER Skalare nicht-SQL-Datentypen: Integers: BINARY_INTEGER, INTEGER, INT, SMALLINT Decimal numbers: DEC, DECIMAL, DOUBLE, PRECISION, NUMERIC, REAL BOOLEAN. Werte: True, False, NULL

18 Dr. Heidrun BethgePL/SQL18 BINARY_INTEGER Kein SQL-Datentyp, reines PL/SQL Ist identisch mit PLS_INTEGER seit der Version 10g release 1 Ganze Zahlen von bis , d. h. 32 Bit Verbraucht weniger Speicherplatz als NUMBER Schneller als NUMBER, da Hardware Arithmetik angewendet wird Für Integer innerhalb dieses Wertebereichs sollte dieser Datentyp gewählt werden

19 Dr. Heidrun BethgePL/SQL19 Deklaration von Variablen und Konstanten Variablen und Konstanten werden im Deklarationsbereich des PL/SQL Blocks deklariert. Variablendeklaration ist zwingend erforderlich. Jede Variable und Konstante hat einen spezifischen Datentyp. Variablen: –birthday DATE;-- mit NULL initialisiert –birthday DATE := NULL; -- äquivalent zu obigem –emp_count SMALLINT; –i, j, k SMALLINT; -- nicht zulässig Konstanten: –credit_limit CONSTANT REAL := ;

20 Dr. Heidrun BethgePL/SQL20 Deklaration Besonderheiten DEFAULT: –blood_type CHAR DEFAULT ‘0‘; –blood_type CHAR := ‘0‘; –credit BINARY_INTEGER RANGE ; NOT NULL: –acct_id INTEGER(4) NOT NULL := 9999; Initialisierungswert muss bei NOT NULL mit angegeben werden

21 Dr. Heidrun BethgePL/SQL21 %TYPE und %ROWTYPE %TYPE für Felder oder Variablen credit REAL(7, 2); debit credit%TYPE; v_ employees. %TYPE; Datentyp einer Variable oder eines Felds einer Tabelle wird geerbt. %ROWTYPE für Datensätze DECLARE emprec employees%ROWTYPE; BEGIN emprec.empid := 10; emprec.deptid := 20; END;

22 Dr. Heidrun BethgePL/SQL22 Wertzuweisung 1.Wertzuweisungszeichen: := –zahl := 1; –zeichenkette := 'Zeichen'; –logisch := FALSE; –datum := '01-JAN-91'; –tax := price * taxe_rate; –bonus := current_salary * 0.10; –amount := TO_NUMBER(SUBSTR(‘750 dollars‘, 1, 3); 2.Datenbankwerte in Variable über SELECT –SELECT sal * 0.10 INTO Bonus FROM emp WHERE empno = emp_id;

23 Dr. Heidrun BethgePL/SQL23 Was ist PL/SQL? PL/SQL Blöcke Datentypen Kontrollstrukturen Datenbankstrukturen / Cursor Prozeduren und Funktionen Fehlerbehandlung

24 Dr. Heidrun BethgePL/SQL24 Kontrollstrukturen Verzweigungen –IF –CASE Schleifen & Sprünge –LOOP –WHILE LOOP –FOR LOOP –GOTO

25 Dr. Heidrun BethgePL/SQL25 IF-Struktur IF Bedingung1 THEN Anweisungen1; [ELSIF Bedingung2 THEN Anweisungen2;] [ELSE Anweisungen3;] END IF;

26 Dr. Heidrun BethgePL/SQL26 Beispiel IF DECLARE current_day VARCHAR2(9):='Samstag'; BEGIN IF current_day='Samstag' THEN DBMS_OUTPUT.PUT_LINE('Heute ist Samstag!'); ELSIF current_day='Sonntag' THEN DBMS_OUTPUT.PUT_LINE('Heute ist Sonntag!'); ELSE DBMS_OUTPUT.PUT_LINE('Leider kein Wochenende'); END IF; END;

27 Dr. Heidrun BethgePL/SQL27 CASE CASE variable WHEN Wert1 THEN ; WHEN Wert2 THEN ; WHEN Wert3 THEN ; ELSE ; END CASE; -- CASE WHEN THEN ; ELSE ; END CASE;

28 Dr. Heidrun BethgePL/SQL28 LOOP... IF THEN EXIT; END IF; END LOOP; oder: LOOP... EXIT WHEN END LOOP;

29 Dr. Heidrun BethgePL/SQL29 Beispiel LOOP DECLARE zaehler BINARY_INTEGER:=1; BEGIN LOOP DBMS_OUTPUT.PUT_LINE(zaehler); zaehler:=zaehler+1; EXIT WHEN zaehler=11; END LOOP; END;

30 Dr. Heidrun BethgePL/SQL30 WHILE LOOP... END LOOP; Die Schleife wird solange durchgeführt, wie die wahr bleibt oder ein EXIT ausgeführt wird.

31 Dr. Heidrun BethgePL/SQL31 FOR-LOOP FOR zaehler IN [REVERSE] untere_grenze.. obere_grenze LOOP... END LOOP; Zählervariable wird nicht deklariert Zählervariable ist außerhalb des LOOP nicht mehr gültig Der Zählervariablen können keine Werte zugewiesen werden Keine Schrittweitenangabe

32 Dr. Heidrun BethgePL/SQL32 NULL Das NULL-Statement führt keine Aktion durch und gibt die Kontrolle an den nächsten Befehl weiter. Es kann als Platzhalter eingesetzt werden. Für Kontrollstrukturen ist es erforderlich, dass ausführbare Befehle in die Strukturen eingetragen werden. Sind diese noch nicht programmiert, kann man stattdessen NULL schreiben. IF THEN DBMS_OUTPUT.PUT_LINE('Wahr'); ELSE NULL; END IF;

33 Dr. Heidrun BethgePL/SQL33 Was ist PL/SQL? PL/SQL Blöcke Datentypen Kontrollstrukturen Datenbankstrukturen / Cursor Prozeduren und Funktionen Fehlerbehandlung

34 Dr. Heidrun BethgePL/SQL34 Cursor Ein Cursor wird verwendet, um Daten zu lesen und zu ändern Es gibt zwei Arten Cursors: Impliziter Cursor Lesen von nur einem Datensatz Expliziter Cursor SELECT, INSERT, UPDATE, DELETE von keinem, einem oder mehreren Datensätzen

35 Dr. Heidrun BethgePL/SQL35 Beispiel für einen impliziten Cursor DECLARE depname VARCHAR2(100); BEGIN select department_name into depname from departments where department_id=10; DBMS_OUTPUT.PUT_LINE('Die Abteilung 10 hat den Namen ' || depname); END; Die Ausgabe eines SELECT-Befehls wird an eine PL/SQL Variable mit implizitem Cursor übergeben

36 Dr. Heidrun BethgePL/SQL36 Fehler bei implizitem Cursor DECLARE depname varchar2(100); BEGIN select department_name into depname from departments; DBMS_OUTPUT.PUT_LINE('Die Abteilung hat den Namen ' || depname); END; Die Abfrage darf nur einen Datensatz als Ergebnis liefern.

37 Dr. Heidrun BethgePL/SQL37 Expliziter Cursor SELECT, INSERT, UPDATE, DELETE auf keinem, einem oder mehreren Datensätzen innerhalb von PL/SQL Vorgehensweise: 1.Deklarieren des Cursors 2.Öffnen des Cursors 3.Datensätze einzeln lesen/bearbeiten 4.Schließen des Cursors

38 Dr. Heidrun BethgePL/SQL38 Beispiel für einen expliziten Cursor DECLARE CURSOR dep_cursor IS select department_id, department_name from departments; dep_row dep_cursor%ROWTYPE; BEGIN OPEN dep_cursor; LOOP FETCH dep_cursor INTO dep_row; EXIT WHEN dep_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Abteilung ' || dep_row.department_id || ' ' || dep_row.department_name); END LOOP; CLOSE dep_cursor; END;

39 Dr. Heidrun BethgePL/SQL39 Syntax Cursor CURSOR cursor_name IS select query; DECLARE cursor_variable%ROWTYPE OPEN cursor_name Referenzierung von einzelnen Datensätzen z.B. innerhalb einer Schleife CLOSE cursor_name EXIT WHEN cursor_name%NOTFOUND ermittelt, ob der letzte Datensatz bereits erreicht wurde

40 Dr. Heidrun BethgePL/SQL40 Cursor-Attribute Das DBMS richtet einen Kontextbereich für jedes der folgenden SQL-Befehle ein: INSERT, UPDATE, DELETE, SELECT Der Kontextbereich enthält Informationen über die Anzahl der Ergebnisdatensätze etc. Cursor können diesen Kontextbereich über Cursor-Attribute ansprechen.

41 Dr. Heidrun BethgePL/SQL41 Cursor-Attribute Beispiele SQL%FOUND liefert TRUE, falls beim letzten SQL- Befehl mindestens ein Datensatz beteiligt war. Gegenteil: SQL%NOTFOUND Falls mit SELECT INTO kein Datensatz gefunden wird, ist ein %NOTFOUND nicht sinnvoll, da vorher bereits der Fehler NO_DATA_FOUND entsteht. SQL%ROWCOUNT liefert die Anzahl der beteiligten Datensätze des letzten SQL-Befehls SQL%ROWCOUNT bezieht sich immer auf den letzten SQL-Befehl. Dies wird nicht durch ROLLBACK beeinflusst. SQL%ISOPEN gibt an, ob ein Cursor geöffnet ist.

42 Dr. Heidrun BethgePL/SQL42 CURRVAL / NEXTVAL CURRVAL: aktueller Wert einer SEQUENCE NEXTVAL erhöht die SEQUENCE und gibt neuen Wert zurück Aufruf: sequence_name.CURRVAL Inkrement mittels NEXTVAL lässt sich mittels ROLLBACK nicht rückgängig machen CURRVAL und NEXTVAL können nur in der SELECT-Liste, in der VALUES-Klausel und in der SET-Klausel verwendet werden. ungültig: seq_value := employees_seq.NEXTVAL; SELECT... WHERE employee_id = employees_seq.CURRVAL;

43 Dr. Heidrun BethgePL/SQL43 Was ist PL/SQL? PL/SQL Blöcke Datentypen Kontrollstrukturen Datenbankstrukturen / Cursor Prozeduren und Funktionen Fehlerbehandlung

44 Dr. Heidrun BethgePL/SQL44 Benannte Blöcke werden in der Datenbank gespeichert können Parameter aufnehmen können immer wieder aufgerufen werden, auch von anderen PL/SQL-Programmen Typen benannter Blöcke: –Stored Procedures –Funktionen: geben EINEN Wert zurück, Aufruf auch innerhalb eines SQL-Befehls möglich –Trigger: werden ereignisgesteuert aufgerufen bei Ausführung von INSERT, UPDATE oder DELETE

45 Dr. Heidrun BethgePL/SQL45 Syntax Prozeduren/Funktionen {FUNCTION|PROCEDURE} name [(parameter[, parameter,...])] RETURN datatype IS [Deklarationen] --nicht DECLARE!! BEGIN... [EXCEPTION...] END [name];

46 Dr. Heidrun BethgePL/SQL46 einfache Funktion CREATE OR REPLACE FUNCTION quadriere(zahl NUMBER) RETURN NUMBER IS BEGIN RETURN (zahl * zahl); END quadriere; -- Aufruf der Funktion DECLARE r NUMBER; BEGIN r := quadriere(7); DBMS_OUTPUT.PUT_LINE ('Ergebnis: ' || TO_CHAR(r)); END;

47 Dr. Heidrun BethgePL/SQL47 Funktion eingebettet in Block DECLARE FUNCTION quadriere1(zahl NUMBER) RETURN NUMBER AS zahlquadrat NUMBER; BEGIN zahlquadrat := zahl * zahl; RETURN zahlquadrat; END; BEGIN DBMS_OUTPUT.PUT_LINE(quadriere1(100)); END;

48 Dr. Heidrun BethgePL/SQL48 Ein- und Ausgabeparameter IN (Standard) Eingabeparameter OUT Ausgabeparameter IN OUT beides gleichzeitig IN Werte können nicht verändert werden OUT und IN OUT nicht bei Funktionen NOCOPY: OUT und IN OUT werden als reference und nicht als value (Standard) übergeben Beispiel: DECLARE TYPE Staff IS VARRAY(200) OF Employee; PROCEDURE reorganize (my_staff IN OUT NOCOPY Staff) IS...

49 Dr. Heidrun BethgePL/SQL49 Default-Werte Beispiel: PROCEDURE create_dept ( new_dname CHAR DEFAULT 'TEMP', new_loc CHAR DEFAULT 'TEMP') IS … Aufruf: –create_dept; –create_dept('MARKETING'); –create_dept('MARKETING', 'NEW YORK'); –create_dept('NEW YORK'); –create_dept(, 'NEW YORK'); -- FEHLER! –create_dept(new_loc=>'NEW YORK'); –außerhalb des Blocks bei stored procedure: call create_dept;

50 Dr. Heidrun BethgePL/SQL50 RETURN RETURN beendet Prozedur/Funktion auch für Schnellausstieg z.B. in Schleife geeignet mehrere RETURN möglich Prozeduren: –kein RETURN notwendig, aber möglich –keine Wertübergabe an RETURN Funktionen: –ein RETURN zwingend –es muss ausführbar sein –Wertübergabe zwingend

51 Dr. Heidrun BethgePL/SQL51 PL/SQL Funktionen in SQL Die Funktion darf nicht INSERT, UPDATE oder DELETE enthalten Parameter und Rückgabewert müssen Datenbank- Datentypen haben. Keine OUT und IN OUT Parameter CREATE OR REPLACE FUNCTION mwst ( p_salary IN employees.salary%TYPE) RETURN NUMBER AS BEGIN RETURN (p_salary * 0.19); END mwst; -- SELECT first_name||' '||last_name AS "Angestellter", mwst(salary) AS "Steuern" FROM employees;

52 Dr. Heidrun BethgePL/SQL52 Was ist PL/SQL? PL/SQL Blöcke Datentypen Kontrollstrukturen Datenbankstrukturen / Cursor Prozeduren und Funktionen Fehlerbehandlung

53 Dr. Heidrun BethgePL/SQL53 Exceptions Fehlerbehandlung in PL/SQL 2 Arten von Exceptions: –vordefinierte Exceptions –benutzerdefinierte Exceptions beide werden syntaktisch gleich verwendet Kompilationsfehler sind keine Exceptions

54 Dr. Heidrun BethgePL/SQL54 Vordefinierte Exceptions werden automatisch von PL/SQL ausgelöst: –Fehler bei Befehlen auf Datenbankobjekten (SQL- Befehle) –Programmierfehler (z.B. Division durch Null). Exceptions haben vordefinierte Namen. Diese können in PL/SQL verwendet werden. Jede Exception hat einen Fehlercode, der aus den Buchstaben ORA- und 5 Ziffern besteht. –no_data_found (ORA-00100): Eine SELECT- Anfrage liefert eine leere Datenmenge –not_logged_on (ORA-01012): Keine Verbindung zur Datenbank

55 Dr. Heidrun BethgePL/SQL55 Laufzeitfehler abfangen DECLARE wert1 NUMBER := 10; wert2 NUMBER := 0; ergebnis NUMBER; BEGIN -- Division durch Null ergebnis := wert1 / wert2; DBMS_OUTPUT.PUT_LINE('Ergebnis = ' || ergebnis); EXCEPTION -- Nur einer der WHEN-Blöcke wird ausgeführt WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Es wurde durch Null geteilt.'); ergebnis := NULL; WHEN OTHERS THEN -- alle anderen Fehler DBMS_OUTPUT.PUT_LINE('Ein anderer Fehler ist aufgetreten.'); ergebnis := NULL; END;

56 Dr. Heidrun BethgePL/SQL56 benutzerdefinierte Exception DECLARE fehlerdef EXCEPTION; BEGIN IF true THEN RAISE fehlerdef; END IF; EXCEPTION WHEN fehlerdef THEN -- diese Exception DBMS_OUTPUT.PUT_LINE('fehlerdef exception.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('irgendein anderer Fehler'); END;


Herunterladen ppt "Dr. Heidrun BethgePL/SQL1 procedural language / structured query language."

Ähnliche Präsentationen


Google-Anzeigen