PL/SQL - Einführung 1.

Slides:



Advertisements
Ähnliche Präsentationen
OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem.
Advertisements

Algorithmentheorie 08 – Dynamische Programmierung (1)
Datenintegrität Einschränkung der möglichen Datenbankzustände und -übergänge auf die in der Realität möglichen Formulierung von Integritätsbedingungen.
Datenintegrität Integitätsbedingungen Schlüssel
Imperative Programmierung
PL/SQL - Einführung. © Prof. T. Kudraß, HTWK Leipzig Vorteile Application Other DBMSs Application Oracle with PL/SQL SQL SQL SQL SQL SQLIF...THENSQLELSESQL.
PL/SQL - Programmierung von Programmeinheiten. © Prof. T. Kudraß, HTWK Leipzig Gespeicherte Prozeduren – Eine Prozedur ist ein benannter PL/SQL Block,
Transaction Synchronization for XML Data in Client Server Web Applications Stefan Böttcher & Adelhard Türling Universität Paderborn.
Folien 2-5, 7-8 © Prof. Dr. Manfred Rössle (FH Aalen)
PL/SQL - Kurze Einführung -.
System J – Compiler – Praktikum: Datenbanksystementwicklung Knut Stolze
© A. Kemper / A. Eickler1 Kapitel 5: Datenintegrität Integitätsbedingungen Schlüssel Beziehungskardinalitäten Attributdomänen Inklusion bei Generalisierung.
10. Grundlagen imperativer Programmiersprachen
Verteilte Software - Java - Prozedurale Programmierung 1
Objektrelationales Mapping mit JPA Entity Mapping Jonas Bandi Simon Martinelli.
Datensicherheit in DBMS
IS: Datenbanken, © Till Hänisch 2000 Tabellen In relationalen DB werden Daten in Tabellen organisiert Jede Spalte enthält eine bestimmte Art von Information,
IS: Datenbanken, © Till Hänisch 2000 CREATE TABLE Syntax: CREATE TABLE name ( coldef [, coldef] [, tableconstraints] ) coldef := name type [länge], [[NOT]NULL],
Dynamische Webseiten Java servlets.
PL/SQL – Die prozedurale Erweiterungssprache Zu SQL
Oracle PL/SQL Server Pages (PSP). © Prof. T. Kudraß, HTWK Leipzig Grundidee: PSP – Internet-Seiten mit dynamischer Präsentation von Inhalten durch Einsatz.
Open Database Connectivity (ODBC). © Prof. T. Kudraß, HTWK Leipzig Open Database Connectivity (ODBC) Idee: – API für eine DBMS, das ein Call-Level-Interface.
Datenbank-Zugriffsschnittstellen am Beispiel von Oracle und PL/SQL.
SQL/XML. © Prof. T. Kudraß, HTWK Leipzig 2 2 Motivation Speicherung von XML in allen großen kommerziellen DBMS vorhanden proprietäre Lösungen für die.
PL/SQL - Einführung. © Prof. T. Kudraß, HTWK Leipzig Vorteile Application Other DBMSs Application Oracle with PL/SQL SQL SQL SQL SQL SQLIF...THENSQLELSESQL.
PL/SQL - Programmierung von Programmeinheiten. © Prof. T. Kudraß, HTWK Leipzig Gespeicherte Prozeduren – Eine Prozedur ist ein benannter PL/SQL Block,
PL/SQL - Programmierung von Programmeinheiten. © Prof. T. Kudraß, HTWK Leipzig Gespeicherte Prozeduren – Eine Prozedur ist ein benannter PL/SQL Block,
Text-Retrieval mit Oracle Vortrag von Andreas Mück & David Diestel.
SQL 2 Order by null Aggregatfunktionen group by Join subselect.
Oracle interMedia Audio Vortrag für das Seminar Oracle Zusatzoptionen Chris Haußmann.
DVG Verkettete Listen Verkettete Listen. DVG Verkettete Listen 2 Primitive Datentypen Vorteile: –werden direkt vom Prozessor unterstützt.
1 Datenintegrität Statische Bedingung (jeder Zustand) Dynamische Bedingung (bei Zustandsänderung) Bisher: Definition eines Schlüssels 1:N - Beziehung Angabe.
1 Kapitel 8: Datenintegrität. 2 Datenintegrität Statische Bedingung (jeder Zustand) Dynamische Bedingung (bei Zustandsänderung) Bisher: Definition eines.
Einführung in die Programmierung Datensammlung
objekt-relationale Datenbanken
FH-Hof Sortieren mit Binären Bäumen Richard Göbel.
OO implementieren Teil IV Objekte erzeugen. © René ProbstModul 226IV - 2 Von der Klasse zum Objekt Plan Bau Objekt Klasse Instanzierung Objekt Das Objekt.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
FH-Hof Standard Query Language Richard Göbel. FH-Hof Geschichte der Sprache SQL System/R-Projekts von IBM zu Beginn der 70er Jahre: Entwicklung der Sprache.
Betrieb von Datenbanken Marco Skulschus & Marcus Wiederstein Datenmanipulation Lehrbuch, Kapitel 4.
Datenintegrität Integitätsbedingungen Schlüssel
Entity Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Advanced Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Algorithmen und Datenstrukturen Übungsmodul 6
WS 2012/13 Datenbanksysteme Fr 15:15 – 16:45 R Vorlesung #8 SQL (Teil 5)
SS 2004 Datenbanken 4W Mi 13:30 – 15:00 G 2.30 Vorlesung #9 SQL (Teil 4)
WS 2009/10 Datenbanksysteme Fr 15:15 – 16:45 R Vorlesung #7 SQL (Teil 4)
Erläuterung der wichtigsten Befehle
Copyright Oracle Corporation, All rights reserved. 6 Unteranfragen (Subqueries)
Folienadaption HS, 4/99.
PL/SQL - Kurze Einführung April 2003Übung Data Warehousing: PL/SQL 2 PL/SQL.. ist eine Oracle-eigene, prozedurale Programmiersprache Sämtliche.
Einführung in SQL Universeller Zugriff auf Daten in Datenbanksystemen unterschiedlicher Systemhersteller!
Verdichten von Daten mit Gruppenfunktionen
SQL Server 2005 CLR Integration Sebastian Weber Microsoft Deutschland GmbH
procedural language / structured query language
Structured Query Language
8 Erzeugen und Verwalten von Tabellen Ziele Kennenlernen der wichtigsten Datenbankobjekte Anlegen von Tabellen Datentypen zur Definition von Spalten.
3 Einzelzeilen-Funktionen. 3-2 Ziele Verschiedene Typen von Funktionen, die in SQL verfügbar sind Verwendung von numerischen, Zeichen- und Datumsfunktionen.
2 Auswählen und Sortieren von Daten. 2-2 Filtern von Zeilen mit Selektion "…suche alle Angestellten in Abteilung 10" EMP EMPNO ENAME JOB... DEPTNO 7839KINGPRESIDENT.
Integritätsbedingungen (Constraints)
10 Sichten (Views) Ziele Verständnis einer View Erzeugen einer View Lesen von Daten durch eine Sicht Ändern der Definition von Views Einfügen, Ändern.
7 Verändern von Daten. 9-2 Ziele Beschreibe jeden DML Befehl Einfügen von Zeilen in eine Tabelle Ändern von Zeilen in einer Tabelle Löschen von Zeilen.
11 Verwaltung von Abhängigkeiten. Ziele Am Ende dieser Lektion verfügen Sie über die folgenden Kenntnisse: Überwachen prozeduraler Abhängigkeiten Effekte.
WS 2013/14 Datenbanksysteme Do 17:00 – 18:30 R Vorlesung #8 SQL (Teil 5)
11 Zugriffskontrolle (Access Control) Ziele Privilegien Rollen GRANT und REVOKE Befehl Privilegien Rollen GRANT und REVOKE Befehl.
Einfache SQL-Befehle Schedule: Timing Topic 40 minutes Lecture
Datentypen: integer, char, string, boolean
Datentypen: integer, char, string, boolean
Vorlesung #8 SQL (Teil 5).
GRUNDLAGEN WISSENSCHAFTLICHEN ARBEITENS MODULA-2 SONAY SUBAYAZ
 Präsentation transkript:

PL/SQL - Einführung 1

Vorteile von PL/SQL Enge Integration mit SQL Höhere Performance Bessere Sicherheit Höhere Produktivität Nutzung vordefi- nierter Packages Unterstützung von OO Programmierung SQL Other DBMSs Application SQL SQL SQL SQL IF...THEN ELSE END IF; Oracle with PL/SQL Application

PL/SQL Blockstruktur DECLARE – Optional BEGIN – Mandatory Variable, Cursor, User-defined Exceptions (Ausnahmen) BEGIN – Mandatory SQL Statements PL/SQL Statements EXCEPTION – Optional Aktionen, die im Fehlerfall auszuführen sind END; – Mandatory DECLARE v_variable VARCHAR2(5); BEGIN SELECT column_name INTO v_variable FROM table_name; EXCEPTION WHEN exception_name THEN ... END;

Anonymous Procedure Function Blocktypen Anonymous Procedure Function [DECLARE] BEGIN --statements [EXCEPTION] END; PROCEDURE name IS BEGIN --statements [EXCEPTION] END; FUNCTION name RETURN datatype IS BEGIN --statements RETURN value; [EXCEPTION] END;

Programmkonstrukte DECLARE BEGIN EXCEPTION END; Anonymous block Stored procedure/ function DECLARE BEGIN EXCEPTION END; Application trigger Application procedure/ function Database trigger Packaged procedure/ function

Variablen in PL/SQL Behandlung von Variablen Variablen-Typen Deklarieren und initialisieren in der Declaration Section. Zuweisung neuer Werte an Variable in der Executable Section. Durchreichen von Werten in PL/SQL Blöcke durch Parameter. Anzeige von Ergebnissen durch Ausgabe-Variable. Variablen-Typen PL/SQL Variable Skalar Composite (Zusammengesetzt) Reference LOB (large objects) Non-PL/SQL Variables Bind und Host-Variable

Deklaration von PL/SQL-Variablen Syntax identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr]; DECLARE v_hiredate DATE; v_deptno NUMBER(2) NOT NULL := 10; v_location VARCHAR2(13) := 'Atlanta'; c_comm CONSTANT NUMBER := 1400;

Wertzuweisungen an Variable Syntax Beispiele: Setze ein vordefiniertes Einstellungsdatum für neue Angestellte. identifier := expr; v_hiredate := '31-DEC-98'; Setze den Angestellten-Namen auf “Maduro.” v_ename := 'Maduro';

Skalare Basisdatentypen VARCHAR2 (maximum_length) NUMBER [(precision, scale)] DATE, TIMESTAMP, INTERVAL CHAR [(maximum_length)] LONG (jetzt: CLOB) LONG RAW (jetzt: BLOB) BOOLEAN BINARY_INTEGER / PLS_INTEGER v_job VARCHAR2(9); v_count BINARY_INTEGER := 0; v_total_sal NUMBER(9,2) := 0; v_orderdate DATE := SYSDATE + 7; c_tax_rate CONSTANT NUMBER(3,2) := 8.25; v_valid BOOLEAN NOT NULL := TRUE; Skalare Variablendeklarationen (Beispiele):

%TYPE Attribut Beispiele Deklariere eine Variable entsprechend einer Tabellenspalten-Definition einer anderen bereits deklarierten Variablen Präfix %TYPE mit: DB-Tabelle und Spalte Name der vorher deklarierten Variablen Beispiele ... v_ename emp.ename%TYPE; v_balance NUMBER(7,2); v_min_balance v_balance%TYPE := 10;

Referenzieren von Nicht-PL/SQL-Variablen Speichere das Jahresgehalt in einer SQL*Plus Host-Variablen. Referenziere Nicht-PL/SQL Variable als Host-Variable. Referenzen erhalten als Präfix Doppelpunkt (:). :g_monthly_sal := v_sal * 12; Nutzung von Bind Variablen bei Dynamic SQL Statements In WHERE und VALUES-Klauseln dynamischer SQL-Befehle USING-Klausel definiert korrespondierende PL/SQL-Variable Anwendung des Prinzips bei Entwicklungstools wie APEX 'DELETE FROM employees WHERE employee_id = :id' USING emp_id;

Datentyp-Konvertierung Konvertiere Daten in vergleichbare Datentypen Gemischte Datentypen können zu Fehlern führen Vermeide implizite Konvertierung (langsamer, evtl. anderes Ergebnis in künftigen Releases) Explizite Konvertieurng mittels Konvertierungs- funktionen: TO_CHAR TO_DATE TO_NUMBER DECLARE v_date VARCHAR2(15); BEGIN SELECT TO_CHAR(hiredate, 'MON. DD, YYYY') INTO v_date FROM emp WHERE empno = 7839; END;

PL/SQL Collections assoziative Arrays (index-by tables) Nested Tables PL/SQL TABLE Typ Elementzugriff über Position oder Suche nach Strings über Indexwert Vergleichbar mit Hash-Tabellen in anderen Programmiersprachen Nested Tables Beliebige Anzahl von Elementen Nutzung der äquivalenten SQL-Typen, somit Speicherung in Datenbanktabellen und Zugriff mittels SQL Varrays (variable-size arrays) feste Anzahl von Elementen (Obergrenze kann erhöht werden) Nutzung der äquivalenten SQL-Typen, somit Speicherung in DB-Tabellen und Verarbeitung mittels SQL (weniger flexibel als nested tables) Schachtelung von Collections möglich (somit auch mehrdimensionale Arrays)

PL/SQL Records enthalten eine oder mehrere Komponenten: Skalar, RECORD, oder PL/SQL TABLE Datentyp (genannt: Felder) Sammlung von Feldern als logische Einheit behandelt ähnlich wie Records in Programmiersprachen (z.B. Pascal) nicht das gleiche wie Zeilen einer DB-Tabelle bequem zum Lesen einer Datenzeile aus Tabelle zur Verarbeitung

Erzeugen eines PL/SQL-Record Syntax field_declaration ist definiert als: TYPE type_name IS RECORD (field_declaration[, field_declaration]…); identifier type_name; field_name {field_type | variable%TYPE | table.column%TYPE | table%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expr] Beispiel: Deklariere Variable, um Name, Job und Gehalt eines neuen Angestellten zu speichern ... TYPE emp_record_type IS RECORD (ename VARCHAR2(10), job VARCHAR2(9), sal NUMBER(7,2)); emp_record emp_record_type;

%ROWTYPE Attribut Deklariere Variable entsprechend einer Menge von Spalten einer DB-Tabelle oder Sicht. Präfix %ROWTYPE mit DB-Tabelle. Felder im Record übernehmen Namen und Datentyp von den Spalten aus Tabelle oder Sicht Vorteile: Nummer und Datentyp der Spalten können sich zur Laufzeit ändern Nützlich für Lesen einer Zeile mit SELECT Beispiel: Deklariere Variable, die die gleiche Information über Abteilungen und Angestellte speichert wie die zugehörige DEPT und EMP Tabelle. dept_record dept%ROWTYPE; emp_record emp%ROWTYPE;

Erzeugen einer PL/SQL Table Syntax TYPE type_name IS TABLE OF {column_type | variable%TYPE | table.column%TYPE} [NOT NULL] [INDEX BY BINARY_INTEGER]; identifier type_name; Deklariere eine PL/SQL Variable, um einen Namen zu speichern. ... TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type; Beispiel

Identifier PL/SQL Block - Syntax können bis zu 30 Zeichen enthalten dürfen keine Schlüsselwörter enthalten müssen mit Buchstaben beginnen sollten nicht gleichen Namen wie DB-Tabelle haben Literale Zeichen und Datums-Literale müssen in einfachen Hochkommas eingeschlossen sein auch numerische Literale möglich Kommentare Einzelzeile: -- mehrere Zeilen: Kommentar zwischen /* und */

Geschachtelte Blöcke und Variablen-Scope Beispiel ... x BINARY_INTEGER; BEGIN DECLARE y NUMBER; END; Scope von x Scope von y

SQL-Befehle in PL/SQL Extrahiere eine Datenzeile aus der Datenbank mittels SELECT Befehl. Nur eine einfache Menge von Werten kann zurückgeliefert werden. Mache Änderungen an Zeilen in der Datenbank mittels DML-Befehlen. Kontrolliere eine Transaktion mittels COMMIT, ROLLBACK, oder SAVEPOINT Kommando. Bestimme DML Ergebnis mit impliziten Cursorn.

SELECT Befehle in PL/SQL Lesen von Daten aus der Datenbank mit SELECT SELECT select_list INTO {variable_name[, variable_name]... | record_name} FROM table WHERE condition; Beispiel: Lese Bestell- und Lieferdatum für eine bestimmte Bestellung (INTO) DECLARE v_orderdate ord.orderdate%TYPE; v_shipdate ord.shipdate%TYPE; BEGIN SELECT orderdate, shipdate INTO v_orderdate, v_shipdate FROM ord WHERE id = 620; ... END;

INSERT und DELETE funktionieren analog Ändern von Daten Beispiel: Erhöhe das Gehalt aller Angestellten in der Tabelle EMP, die Analysten sind. DECLARE v_sal_increase emp.sal%TYPE := 2000; BEGIN UPDATE emp SET sal = sal + v_sal_increase WHERE job = 'ANALYST'; END; INSERT und DELETE funktionieren analog

Transaktionsverarbeitung in PL/SQL Beginne eine Transaktion mit dem ersten DML Befehl, der einem COMMIT oder ROLLBACK Befehl folgt (implizites BOT) Blockstruktur (BEGIN-END)  Transaktionsstruktur COMMIT: beendet explizit Transaktion, macht Änderungen dauerhaft und nach außen sichtbar ROLLBACK: beendet explizit Transaktion, macht alle Änderungen rückgängig SAVEPOINT: Markierung innerhalb einer Transaktion zum teilweisen Zurückrollen der Transaktion: ROLLBACK TO Savepoint

SQL-Attribute Mit SQL-Attributen kann das Ergebnis eines SQL-Befehls getestet werden. SQL%ROWCOUNT Anzahl Zeilen, die vom letzten SQL- Befehl betroffen ist SQL%FOUND Boolesches Attribut, ist gleich TRUE, wenn der letzte SQL-Befehl mehr als eine Zeile betrifft SQL%NOTFOUND Boolesches Attribut, ist gleich TRUE, wenn der letzte SQL-Befehl überhaupt keine Zeile betrifft SQL%ISOPEN FALSE, weil PL/SQL implizite Cursor unmittelbar nach Ausführung schließt

IF-Anweisungen Syntax IF condition THEN statements; [ELSIF condition THEN statements;] [ELSE END IF; Beispiel: Setze die Manager-ID auf 22, wenn der Angestellten-Name Osborne ist. IF v_ename = 'OSBORNE' THEN v_mgr := 22; END IF;

IF-THEN-ELSIF Anweisungen Für einen gegebenen Wert, berechne einen Prozentanteil dieses Wertes basierend auf einer Bedingung. Beispiel: . . . IF v_start > 100 THEN v_start := 2 * v_start; ELSIF v_start >= 50 THEN v_start := .5 * v_start; ELSE v_start := .1 * v_start; END IF;

Einfache Schleife Syntax Beispiel LOOP statement1; -- delimiter . . . EXIT [WHEN condition]; END LOOP; Condition: Boolean variable | expression (TRUE, FALSE, NULL) -- delimiter -- statements -- EXIT statement DECLARE v_ordid item.ordid%TYPE := 601; v_counter NUMBER(2) := 1; BEGIN LOOP INSERT INTO item(ordid, itemid) VALUES(v_ordid, v_counter); v_counter := v_counter + 1; EXIT WHEN v_counter > 10; END LOOP; END; Beispiel

Index wird bereits implizit deklariert FOR-Schleife Syntax FOR Schleife als abgekürzter Test einer bestimmten Anzahl von Iterationen Index wird bereits implizit deklariert FOR counter in [REVERSE] lower_bound..upper_bound LOOP statement1; statement2; . . . END LOOP;

FOR-Schleife (Beispiel) Einfügen der ersten 10 Gegenstände für Bestell-Nr 601. DECLARE v_ordid item.ordid%TYPE := 601; BEGIN FOR i IN 1..10 LOOP INSERT INTO item(ordid, itemid) VALUES(v_ordid, i); END LOOP; END;

WHILE-Schleife Syntax WHILE-Schleife zur Wiederholung von Befehlen solange eine Bedingung erfüllt ist, d.h.TRUE. WHILE condition LOOP statement1; statement2; . . . END LOOP; Condition wird geprüft am Beginn jeder Iteration.

WHILE-Schleife (Beispiel) Einfügen von n Gegenständen (p_items) zu einer selbstgewählten Bestell-Nr. (p_new_order) ACCEPT p_new_order PROMPT 'Enter the order number: ' ACCEPT p_items - PROMPT 'Enter the number of items in this order: ' DECLARE v_count NUMBER(2) := 1; BEGIN WHILE v_count <= &p_items LOOP INSERT INTO item (ordid, itemid) VALUES (&p_new_order, v_count); v_count := v_count + 1; END LOOP; COMMIT; END; /

Ein Cursor ist ein privater SQL Arbeitsbereich. SQL Cursor Jeder SQL-Befehl, der vom Oracle-Server ausgeführt wird, ist mit einem individuellen Cursor assoziiert. Ein Cursor ist ein privater SQL Arbeitsbereich. Es gibt zwei Typen von Cursorn: Implizite Cursor Explizite Cursor Oracle Server nutzt implizite Cursor, um SQL-Befehle (SELECT, PL/SQL DML) zu übersetzen und auszuführen. Explizite Cursor werden explizit durch den Programmierer benannt und deklariert.

Kontrolle expliziter Cursor No DECLARE OPEN FETCH EMPTY? Yes CLOSE Erzeuge benannte SQL Area Identifiziere die aktive Menge Lade die aktuelle Zeile in Variablen Teste auf vorhandene Zeilen Freigabe der aktiven Menge

Kontrolle expliziter Cursor Open Cursor. Pointer Cursor Fetch eine Zeile vom Cursor. Pointer Cursor Solange bis leer. Pointer Cursor Close Cursor. Cursor

Deklaration eines Cursors Syntax keine INTO Klausel in der Cursor-Deklaration. Wenn Verarbeitung der Zeilen in bestimmter Reihen-folge erforderlich, ORDER BY Klausel verwenden Beispiel CURSOR cursor_name IS select_statement; DECLARE CURSOR emp_cursor IS SELECT empno, ename FROM emp; CURSOR dept_cursor IS SELECT * FROM dept WHERE deptno = 10; BEGIN ...

Nutze Cursor-Attribute, um das Ergebnis eines Fetch zu testen. Öffnen eines Cursors Syntax Öffnen des Cursors, um die Query auszuführen und die aktive Menge zu identifizieren. Wenn die Query keine Zeilen zurückliefert, wird eine Exception erzeugt. Nutze Cursor-Attribute, um das Ergebnis eines Fetch zu testen. OPEN cursor_name;

Lese die aktuellen Zeilenwerte in Ausgabevariablen („Fetch“) Daten lesen vom Cursor Syntax Lese die aktuellen Zeilenwerte in Ausgabevariablen („Fetch“) Gleiche Anzahl von Variablen wie Spalten Jede Variable muss mit den Spalten von der Position her übereinstimmen Test, ob der Cursor Zeilen enthält FETCH cursor_name INTO [variable1, variable2, ...] | record_name];

Daten lesen vom Cursor (Beispiel) Beispiele FETCH emp_cursor INTO v_empno, v_ename; ... OPEN defined_cursor; LOOP FETCH defined_cursor INTO defined_variables EXIT WHEN ...; -- Process the retrieved data END;

Schließen eines Cursors Syntax Schließe den Cursor nach beendeter Verarbeitung der Zeilen Re-Open des Cursors wenn erforderlich nach Schließen eines Cursors können Daten nicht mehr gefetcht werden. CLOSE cursor_name;

Explizite Cursor-Attribute Einholen von Status-Informationen über einen Cursor Attribut Typ Beschreibung %ISOPEN Boolean Ist gleich TRUE wenn der Cursor geöffnet ist %NOTFOUND Boolean Ist gleich TRUE wenn der letzte Fetch keine Zeile geliefert hat %FOUND Boolean Ist gleich TRUE wenn der letzte Fetch eine Zeile geliefert hat; Komplement zu %NOTFOUND %ROWCOUNT Number Gesamtanzahl Zeilen, die bisher zurückgegeben wurden

Fetch von Zeilen nur möglich, wenn Cursor geöffnet ist %ISOPEN Attribut Fetch von Zeilen nur möglich, wenn Cursor geöffnet ist Nutze %ISOPEN Cursor-Attribut vor Ausführung eines Fetch, um zu testen, ob der Cursor geöffnet ist Beispiel: IF NOT emp_cursor%ISOPEN THEN OPEN emp_cursor; END IF; LOOP FETCH emp_cursor...

Cursor und Records Verarbeitung der Zeilen einer aktiven Menge durch Lesen der Werte (Fetch) in einen PL/SQL RECORD. Beispiel DECLARE CURSOR emp_cursor IS SELECT empno, ename FROM emp; emp_record emp_cursor%ROWTYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO emp_record; ...

FOR Schleifen mit Cursor Syntax FOR Schleife mit Cursor ist eine Abkürzung, um explizite Cursor zu verarbeiten Implizit: Open, Fetch und Close des Cursor Record ist implizit deklariert FOR record_name IN cursor_name LOOP statement1; statement2; . . . END LOOP;

FOR-Schleifen mit Cursor (Beispiel) Lese Angestellte nacheinander, bis keiner mehr übrig ist. DECLARE CURSOR emp_cursor IS SELECT ename, deptno FROM emp; BEGIN FOR emp_record IN emp_cursor LOOP -- implicit open and implicit fetch occur IF emp_record.deptno = 30 THEN ... END LOOP; -- implicit close occurs END;

Ausnahmebehandlung in PL/SQL Was ist eine Exception? Identifier in PL/SQL, der erzeugt wird während der Ausführung Wie wird sie erzeugt? Ein Oracle-Fehler tritt auf Explizit erzeugen (benutzerdefinierte Ausnahme) Wie behandeln? Abfangen mit einem Handler Propagieren zur Aufrufumgebung

Behandlung von Ausnahmen Exception abfangen Exception propagieren DECLARE DECLARE BEGIN BEGIN Raise Exception Raise Exception EXCEPTION EXCEPTION Exception wird abgefangen Exception nicht abgefangen Exception propagiert zur aufrufenden Umgebung END; END;

Abfangen von Exceptions Syntax EXCEPTION WHEN exception1 [OR exception2 . . .] THEN statement1; statement2; . . . [WHEN exception3 [OR exception4 . . .] THEN . . .] [WHEN OTHERS THEN

Abfangen von Oracle-Fehlern Standardnamen in Exception-Handling Routine verwenden Beispiele vordefinierter Exceptions: NO_DATA_FOUND: SELECT liefert keine Daten TOO_MANY_ROWS: Liefert mehrere Zeilen, nur eine erlaubt INVALID_CURSOR: Illegale Cursor-Operation ZERO_DIVIDE: Division durch 0 DUP_VAL_ON_INDEX: Versuch, ein Duplikat einzufügen

Vordefinierte Exception Syntax BEGIN SELECT ... COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN statement1; statement2; WHEN TOO_MANY_ROWS THEN WHEN OTHERS THEN statement3; END;

Abfangen benutzerdefinierter Exceptions Declare Raise Reference Declarative section Executable section Exception-handling section Benenne Exception Erzeuge die Exception explizit mit RAISE-Statement Behandele die erzeugte Exception

Benutzerdefinierte Exceptions (Beispiel) DECLARE e_invalid_product EXCEPTION; BEGIN UPDATE product SET descrip = '&product_description' WHERE prodid = &product_number; IF SQL%NOTFOUND THEN RAISE e_invalid_product; END IF; COMMIT; EXCEPTION WHEN e_invalid_product THEN DBMS_OUTPUT.PUT_LINE('Invalid product number.'); END; e_invalid_product EXCEPTION; 1 RAISE e_invalid_product; 2 e_invalid_product 3

Funktionen zum Abfangen von Exceptions (Beispiel) DECLARE v_error_code NUMBER; v_error_message VARCHAR2(255); BEGIN ... EXCEPTION WHEN OTHERS THEN ROLLBACK; v_error_code := SQLCODE ; v_error_message := SQLERRM ; INSERT INTO errors VALUES(v_error_code, v_error_message); END; Fehler-Code SQLCODE Fehler-Meldung SQLERRM

RAISE_APPLICATION_ERROR Syntax Prozedur zur Ausgabe benutzerdefinierter Fehler-meldungen aus gespeicherten Subprogrammen genutzt an 2 Stellen: Executable Section, Exception Section liefert Fehlermeldungen, die wie Oracle-Fehler aussehen raise_application_error (error_number, message[, {TRUE | FALSE}]);