Zusammengesetzte Datentypen Arbeit mit zusammengesetzten Datentypen • Typen: – PL/SQL RECORDS – PL/SQL TABELLEN • Enthalten interne Komponenten • Sind wiederverwendbar Copyright © Oracle Corporation, 1998. All rights reserved. PL/SQL Records • Müssen eine oder mehrere Komponenten von einfachen Variablen, RECORDs oder Feldern enthalten. • Sind in der Struktur ähnlich den Records in 3GL • Sind nicht das gleiche wie die Tupel in der DBTabelle. • Behandeln mehrere Felder als logische Einheit SQL2 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Erzeugen eines PL/SQL Records Syntax TYPE type_name IS RECORD (field_declaration[, field_declaration]…); identifier type_name; Felddeklaration für die gleiche Struktur field_name {field_type | variable%TYPE | table.column%TYPE | table%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expr] • Sind geeignet zum Holen von Tupeln aus der Tabelle. SQL3 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved SQL4 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Erzeugen eines PL/SQL Records Deklariere eine Variable zum Speichern des Namens, Jobs und Gehalts für einen neuen Angestellten. Beispiel ... TYPE emp_record_type IS RECORD (ename VARCHAR2(10), job VARCHAR2(9), sal NUMBER(7,2)); emp_record emp_record_type; ... SQL5 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Das %ROWTYPE Attribut PL/SQL Record Struktur Feld1 (Datentyp) Feld2 (Datentyp) Feld3 (Datentyp) Feld1 (Datentyp) Feld2 (Datentyp) Feld3 (Datentyp) empno number(4) ename varchar2(10) job varchar2(9) Beispiel SQL6 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Vorteile von %ROWTYPE • Deklariere eine Variable entsprechend einer Anzahl von Spalten in einer DBTabelle oder View. • Anzahlen und Datentypen der entsprechenden Spalten müssen nicht bekannt sein. • Der Name ist: tabellenname%ROWTYPE • Die Anzahl und Datentypen der entsprechenden Spalten könnte geändert worden sein. • Die Felder im Record nehmen die Namen und Datentypen der Spalten der Tabelle oder View an. SQL7 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved • Günstig zum Wiederauffinden eines Tupels mit dem SELECT Statement. SQL8 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved %ROWTYPE Attribut - Beispiel Deklariere eine Variable zum Speichern der gleichen Information über eine Abteilung, die in der DEPT-Tabelle gespeichert ist. dept_record dept%ROWTYPE; Deklariere eine Variable zum Speichern der gleichen Information über einen Angestellten, der in der EMP-Tabelle gespeichert ist. emp_record PL/SQL Tabellen • sind zusammengesetzt aus zwei Komponenten: – Datentyp des Primärschlüssels ist BINARY_INTEGER – Die Spalten sind vom einfachen oder RECORD-Datentyp • Dynamisches Erhöhen, da keine Constraints bestehen. emp%ROWTYPE; SQL9 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Erzeugen einer PL/SQL Tabelle 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 zum Speichern eines Namens. Beispiel ... TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type; ... SQL11 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved SQL10 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved PL/SQL Tabellen Strukturen Primary Key Spalte ... ... 1 Jones 2 Smith 3 Maduro ... ... BINARY_INTEGER einfach SQL12 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Erzeugen einer PL/SQL Tabelle DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; TYPE hiredate_table_type IS TABLE OF DATE INDEX BY BINARY_INTEGER; ename_table ename_table_type; hiredate_table hiredate_table_type; BEGIN ename_table(1) := 'CAMERON'; hiredate_table(8) := SYSDATE + 7; IF ename_table.EXISTS(1) THEN INSERT INTO ... ... END; SQL13 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved PL/SQL Tabelle für Records • Eine Tabellenvariable mit dem %ROWTYPE Attribut wird definiert. • eine PL/SQL Variable wird zum Speichern der Abteilungsinformationen deklariert. Beispiel DECLARE TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER; dept_table dept_table_type; -- Jedes Tupel der dept-Tabelle ist ein Satz SQL14 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Cursor mit Parameter Syntax Das erweiterte Konzept für Explizite Cursor CURSOR cursor_name [(parameter_name datatype, ...)] IS select_statement; • Die Parameterwerte werden in den Cursor eingefügt, wenn der Cursor offen ist und die Anfrage ausgeführt wird. • Cursor können mehrfach für unterschiedliche Sätze geöffnet werden. Copyright © Oracle Corporation, 1998. All rights reserved. SQL16 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Cursor mit Parameter Eingeben der Abteilungsnummer und der Tätigkeit in die WHERE-Klausel. Beispiel Behandlung von Ausnahmen DECLARE CURSOR c1 (v_deptno NUMBER, v_job VARCHAR2) IS SELECT empno, ename FROM emp WHERE deptno = v_deptno AND job = v_job; BEGIN OPEN c1(10, 'CLERK'); ... SQL17 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Copyright © Oracle Corporation, 1998. All rights reserved. Ausnahmebehandlung Behandlung der Ausnahme Ausnahme tritt auf Ausnahme wird behandelt Ausnahme weiterleiten DECLARE DECLARE BEGIN BEGIN EXCEPTION EXCEPTION END; END; Ausnahmetypen • Vordefiniert im Oracle Server • Nicht-vordefiniert im Oracle Server Ausnahme tritt auf • Benutzerdefiniert } Explizite Behandlung Ausnahme wird nicht behandelt Ausnahme wird weitergeleitet SQL19 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Implizit behandelt SQL20 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Behandlung von Ausnahmen Behandlung der Ausnahmen Syntax EXCEPTION WHEN exception1 [OR exception2 . . .] THEN statement1; statement2; . . . [WHEN exception3 [OR exception4 . . .] THEN statement1; statement2; . . .] [WHEN OTHERS THEN statement1; statement2; . . .] SQL21 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Behandlung vordefinierter Oracle Server Errors • Einige vordefinierte Ausnahmen: – NO_DATA_FOUND – TOO_MANY_ROWS – INVALID_CURSOR – ZERO_DIVIDE – DUP_VAL_ON_INDEX • WHEN OTHERS ist die letzte Klausel. • Das Schlüsselwort EXCEPTION startet eine Ausnahme-Behandlungs-Routine. • Verschiedene Ausnahmebehandlungen sind erlaubt. • Nur eine Routine hat gearbeitet bevor der Block verlassen wurde. SQL22 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved Vordefinierte Ausnahmen Syntax BEGIN SELECT ... COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN statement1; statement2; WHEN TOO_MANY_ROWS THEN statement1; WHEN OTHERS THEN statement1; statement2; statement3; END; • Werden über den Namen angesprochen SQL23 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved SQL24 basierend auf OAI-Kurs Copyright © Oracle Corporation, 1998. All rights reserved