PL/SQL – Die prozedurale Erweiterungssprache Zu SQL

Slides:



Advertisements
Ähnliche Präsentationen
Einführung in die Programmiersprache C/C++
Advertisements

Object Relational Mapping
ALP II: Objektorientierte Programmierung Sommersemester 2006
der Universität Oldenburg
der Universität Oldenburg
PL/SQL - Programmierung von Programmeinheiten. © Prof. T. Kudraß, HTWK Leipzig Gespeicherte Prozeduren – Eine Prozedur ist ein benannter PL/SQL Block,
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
10. Grundlagen imperativer Programmiersprachen
FH-Hof Einbindung von JavaScript Anweisungen
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Java: Grundlagen der Sprache
Java: Grundlagen der Objektorientierung
SQL als Abfragesprache
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
IS: Datenbanken, © Till Hänisch 2000 CREATE TABLE Syntax: CREATE TABLE name ( coldef [, coldef] [, tableconstraints] ) coldef := name type [länge], [[NOT]NULL],
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Oracle PL/SQL Server Pages (PSP). © Prof. T. Kudraß, HTWK Leipzig Grundidee: PSP – Internet-Seiten mit dynamischer Präsentation von Inhalten durch Einsatz.
Oracle WebServer - Einführung. © Prof. T. Kudraß, HTWK Leipzig Oracle Web Application Server HTML WebServer ® File system Static HTML PL/SQL Packages.
Entwicklung von XML-Anwendungen mit ORACLE XSU Oberseminar Datenbanken Andreas Rebs, 01INM.
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.
Publikation von XML-Daten mit XSQL Pages. © Prof. T. Kudraß, HTWK Leipzig Vorteile von XSQL Pages einfache Generierung von XML-Dokumenten auf der Basis.
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.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen.
JDBC -Java Database Connectivity-. 15./22. April 2004JDBC2 JDBC.... verbindet Java-Programme mit SQL-basierten Datenbanken.. liefert eine generische SQL-API.
DVG Klassen und Objekte
JDBC EDV JDBC.
Einführung in die Programmierung Datensammlung
Prof. K. Gremminger Folie 1 Vorlesung Datenbanksysteme SS 2002 Cursor-Konzept u Zugriff auf Mengen von Ergebnistupeln u In SQLJ Iteratoren u Vergleichbar.
Prof. K. Gremminger Folie 1 Vorlesung Datenbanksysteme SS 2002 Aufbau einer Verbindung zur Datenbank import java.net.URL; import java.sql.*; class JDBCExample.
2.2 Definition eines Datenbankschemas (SQL-DDL)
JDBC: JAVA Database Connectivity
objekt-relationale Datenbanken
Was umfaßt die CORBA Core Spezifikation? Welche zusätzlichen Komponenten muß ein ORB Produkt beinhalten? Core: CORBA Objekt Modell CORBA Architektur OMG.
SQL PHP und MySQL Referat von Katharina Stracke und Carina Berning
20:00.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
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)
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
PL/SQL - Kurze Einführung April 2003Übung Data Warehousing: PL/SQL 2 PL/SQL.. ist eine Oracle-eigene, prozedurale Programmiersprache Sämtliche.
Grundlagen Wissenschaftlichen Arbeitens Hilal Tekoglu
Einführung in PHP 5.
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
Learning By Doing Ausnahmebehandlung Exceptions (Ausnahmebehandlung) Typische Fehlverhalten zur Laufzeit: s. Buch S. 287ff -Verwendung von null-Objekten.
Datenbankanbindung mit
procedural language / structured query language
Structured Query Language
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
8 Erzeugen und Verwalten von Tabellen Ziele Kennenlernen der wichtigsten Datenbankobjekte Anlegen von Tabellen Datentypen zur Definition von Spalten.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Integritätsbedingungen (Constraints)
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)
Einfache SQL-Befehle Schedule: Timing Topic 40 minutes Lecture
Java-Kurs Übung Besprechung der Hausaufgabe
Trigger-abhängige Client Interaktionen (bezüglich Oracle8i)
The Programming Language Pascal
Implementieren von Klassen
The Programming Language Pascal
 Präsentation transkript:

PL/SQL – Die prozedurale Erweiterungssprache Zu SQL von Andreas Schulz aschulz@imn.htwk-leipzig.de Andreas.Schulz@lpzm.siemens.de

Übersicht Was ist PL/SQL? Aufbau eines PL/SQL-Programms Datentypen Bezeichner Kontrollstrukturen Fehlerbehandlung Unterprogramme Collections, Records und Objekte Packages Cursor

1. Was ist PL/SQL? 4GL (Fourth-Generation Language) Plattformen abhängig von Oracle Moderne Features wie Datenkapselung, Überladen, Ausnahmebehandlung, etc. SQL-Statements benutzen, um Daten zu manipulieren Konstanten und Variablen deklarieren Prozeduren und Funktionen definieren u. v. m.

Manipulation der Daten über Unterprogramme mit definierten Privilegien Zugriff auf Tabelle nicht notwendig Einbettung in andere Programmiersprachen wie C++, Java, ... Gespeichertes Unterprogramm In kompilierter Form Aufruf durch Datenbank-Trigger, andere UP, Oracle-Präcompiler-Applikation Gemeinsamer Speicherbereich (1 Kopie für mehrere User)

Limitierungen Optimiert für high-speed Transaktionsprozesse Anzahl von Token (Bezeichner, Schlüsselwörter, Operatoren, ...) begrenzt Spezifikationen: 32 KB Körper: 64 KB Komplexe SQL-Anweisungen Unterprogramme zerlegen Hostvariablen der Hochsprache verwenden

Grundlagen Viele Regeln anderer Programmiersprachen Hier: Abweichungen Nicht case-sensitiv Statement-Indikator: ; Potenz-Operator: ** Stringverkettung: || @-Operator für Datenbanken Kommentare: /* */: Mehrzeilenkommentare -- bist zum Rest der Zeile

2. Aufbau eines PL/SQL-Programms I Blockstrukturiert Blöcke: Prozeduren, Funktionen, anonyme Blöcke Drei Teile: [DECLARE -- Deklarationsteil] BEGIN -- Ausführungsteil [EXCEPTION -- Ausnahmebehandlungsteil] END;

Aufbau eines PL/SQL-Programms II Unterblöcke im Ausführungs- und Ausnahmebehandlungsteil Lokale Unterprogramme im Deklarationsteil definierbar Nur vom Block aufrufbar, in dem definiert

3. Datentypen SQL-Datentypen wie CHAR, DATE oder NUMBER PL/SQL-Datentypen wie BOOLEAN oder BINARY_INTEGER

Überblick über PL/SQL-Datentypen BINARY_INTEGER DEC DECIMAL DOUBLE PRECISION FLOAT INT INTEGER NATURAL NATURALN NUMBER NUMERIC PLS_INTEGER POSITIVE POSITIVEN REAL SIGNTYPE SMALLINT CHAR CHARACTER LONG LONG RAW NCHAR NVARCHAR2 RAW ROWID STRING UROWID VARCHAR VARCHAR2 BOOLEAN DATE Skalare Datentypen Zusammengesetzte Datentypen RECORD TABLE VARRAY Referenzen REF CURSOR REF object_type LOB Datentypen BFILE BLOB CLOB NCLOB Beschreiben Lob: Spezifizieren Orte von sog. großen Objekten Z. B.: Bilddateien, Videos, Musikdateien bis 4 GB Random Access, d. h. Sprung auf Index möglich Speicherung in-line (in der Datenbank) oder out-of-line (außerhalb)

Ausgewählte Datentypen Wahrheitswerte: Dreiwertige Logik TRUE, FALSE, NULL (fehlender, unbekannter oder nicht anwendbarer Wert) Nicht in Spalte einer Tabelle gelesen oder geschrieben Datum: Auch Tageszeit in Sekunden seit Mitternacht 1. Januar 4712 v. Chr. Bis 31. Dezember 9999 a. D. Berechnungen geben meist Anzahl Tage zurück Können nicht in eine Spalte einer Tabelle geschrieben oder von ihr gelesen werden Berechnungen bei Datumsdaten möglich

BINARY_INTEGER vs. PLS_INTEGER: Operationen mit BINARY_INTEGER langsamer Überlaufexception bei PLS_INTEGER SIGNTYPE ist Tristate-Logik CHAR-Datentyp (einfaches Zeichen): Einfache Hochkommas Als Zahlen in Berechnungen (A := 9 * ‘8‘;) Implizite Umwandlung CHAR-Datentyp (String): Apostrophe zum Quotieren ‘Don‘‘t leave without saving your work!‘ BINARY_INTEGER benutzt Bibliotheksarithmetik, im Gegensatz zu PLS_INTEGER mit Maschinenarithmetik PLS_INTEGER wird empfohlen SIGNTYPE schränkt Zahlenvariablen auf Werte –1, 0, 1 ein CHAR: speichert Zeichenketten bis zu 32767 Bytes wichtig bei CHAR-Datenbankspalten speichern nur 2000 Bytes maximale Länge muss angegeben werden nur Zahlen bei Angaben möglich, nicht durch Variablen oder Konstanten muss man auch bei anderen Datentypen (LONG RAW u. a.) beachten CHARACTER-Datentyp ist gleiche wie CHAR, nur anderer Name, genauso, wie VARCHAR ein Synonym für VARCHAR2 ist CHARACTER und VARCHAR nur für Kompatibilität mit ANSI/ISO allerdings empfohlen, letzteren benutzen, da für Zukunft VARCHAR evtl. eigener Datentyp unterschieden zw. Anzahl Bytes und Anzahl Zeichen Bei unserem Zeichensatz nicht unbedingt notwendig Allerdings bei Japanischem oder Chinesischem Alphabet entspricht Zeichen mehrere Bytes Dafür außerdem Datentypen NCHAR und NVARCHAR2

Nutzerdefinierte Unterdatentypen SUBTYPE CHARACTER IS CHAR Eigene Unterdatentypen Wertebereich für Datentyp Kein neuer Datentyp Z. B.: SUBTYPE BirthDate IS DATE NOT NULL; SUBTYPE Counter IS NATURAL; TYPE NameList IS TABLE OF VARCHAR2(10); SUBTYPE DutyRoster IS NameList; Wie gesagt, CHARACTER Synonym für CHAR Exception bei Überschreitung des Wertebereichs Beschreiben der Beispiele

Deklaration von ... Variablen: Konstanten: birthday DATE; emp_count SMALLINT; i, j, k SMALLINT; -- nicht zulässig birthday DATE; äquivalent zu birthday DATE := NULL; Konstanten: credit_limit CONSTANT REAL := 5000.00; Keine Deklaration von mehreren Variablen oder Konstanten gleichzeitig Standardmäßig Variablen mit NULL initialisiert Bei Konstanten muss Schlüsselwort CONSTANT angegeben werden

Erweiterte Funktionalitäten DEFAULT: blood_type CHAR DEFAULT ‘0‘; blood_type CHAR := ‘0‘; NOT NULL: acct_id INTEGER(4) NOT NULL := 9999; %TYPE: credit REAL(7, 2); debit credit%TYPE; Datentyp einer Variable oder Tabellenspalte %ROWTYPE Beim Initialisieren DEFAULT-Werte NOT NULL, um keine NULL-Werte zuzulassen Initialisierungswert muss mit angegeben werden sinnvoll, wenn man Variable deklariert, die sich auf Datenbankspalte bezieht braucht nicht genauen Datentyp zu kennen wenn sich Datenbankdefinition ändert, ändert sich Datentyp der Variable zur Laufzeit %ROWTYPE später bei Records erklärt

Vorsicht bei Variablen, die gleichen Namen haben, wie Spaltennamen von Tabellen Beispiel: DECLARE ename VARCHAR2(10) := ‘KING‘; BEGIN DELETE FROM emp WHERE ename = ename; Besser: <<main>> ename VARCHAR2(10) := ‚KING‘; DELETE FROM emp WHERE ename = main.ename; Löscht alle Einträge aus Tabelle emp, nicht nur die mit ‘KING‘ Anderen Namen für lokale Variable bevorzugen Oder Block benennen, um qualifizierte Referenz zu haben Wenn in Prozedur oder Funktion, auch Namen zum Identifizieren

Wertzuweisungen Wertzuweisungszeichen: := tax := price * taxe_rate; bonus := current_salary * 0.10; amount := TO_NUMBER(SUBSTR(‘750 dollars‘, 1, 3); valid := FALSE; Datenbankwerte in Variable selecten SELECT sal * 0.10 INTO Bonus FROM emp WHERE empno = emp_id; Wertzuweisungszeichen bereits gesehen

4. Bezeichner max. 30 Zeichen Reservierte Wörter (z. B. BEGIN und END) vordefinierte Bezeichner z. B.: Exception INVALID_NUMBER Reservierte Wörter können nicht benutzt werden Vordefinierte Bezeichner: Im Package Standard Durch lokale Variablen überschrieben

Quotierte Bezeichner doppelte Hochkommas Verbotene Zeichen in Bezeichnern: “*** header info ***“ “on/off“ Reservierte Bezeichner ansprechen SELECT acct, type, bal INTO ... SELECT acct, “TYPE“, bal INTO ... SELECT acct, “type“, bal INTO ... Durch doppelte Hochkommas quotiert Wer macht so was? Spalte in Tabelle heißt type Reserviertes Wort in PL/SQL, aber nicht in SQL Tabelle konnte somit ohne Probleme erzeugt werden Beispiel: Kompilierungsfehler Beispiel: i. O. Spaltenname so geschrieben, wie beim Erstellen der Tabelle festgelegt 3. Beispiel: Kompilierungsfehler

5. Kontrollstrukturen Conditional Control (IF-THEN-ELSE) Iterative Control (LOOP) Sequential Control (GOTO) Conditional Controls ähnlich wie in anderen Programmiersprachen Anderen zwei näher beschreiben

Iterative Controls I LOOP .. END LOOP FOR-LOOP: FOR counter IN [REVERSE] lower_bound .. higher_bound LOOP -- Sequence_of_statements END LOOP; Keine Wertzuweisung für Zählvariable Explizite Deklarierung nicht nötig Keine Schrittweitenangabe Syntax FOR-LOOP beschreiben

Iterative Controls II CURSOR-FOR-LOOP WHILE-LOOP EXIT WHEN LOOP . . . total := total + salary; EXIT WHEN total > 25000; END LOOP;

Sequential Control Verzweigung zu Sprungmarke Labels nur vor ausführbaren Befehl Verzweigungen in Unterblöcken IF valid THEN .. GOTO update_row; -- illegaler Sprung ELSE <<update_row>> UPDATE emp SET .. END IF; Sprungmarken nennt man auch Labels eingeschlossen in „<<>>“. NULL-Statement. Keine Sprünge in Verzweigungen oder innerhalb von IFs, Schleifen oder Unterblöcken

6. Fehlerbehandlung bei Fehler Exception ausgelöst Reaktion in Ausnahmebehandlungsblock Funktionen SQLCODE und SQLERRM Interne Ausnahmefehler: ZERO_DIVIDE Nutzerdefinierte Ausnahmefehler: RAISE EXCEPTION_INIT Exception Handler SQLCODE und SQLERRM sehr nützlich Liefern Oracle-Fehlercode bzw. Fehlermeldung Ausführliche Beschreibung in Dokumentation Situationen beschrieben, wann und wodurch ausgelöst Interne Ausnahmefehler: werden automatisch ausgelöst Implizit zur Laufzeit Division durch 0 Nutzerdefinierte Ausnahmefehler: RAISE-Statement Auch vordefinierte Fehler Im Deklarationsteil deklariert Durch EXCEPTION_INIT Verbindung mit Fehlernummer und Fehlertext

DECLARE out_of_stock EXCEPTION; number_on_hand NUMBER(4); BEGIN. ... IF number_on_hand < 1 THEN RAISE out_of_stock; END IF; EXCEPTION WHEN out_of_stock THEN -- Fehlerbehandlung WHEN OTHERS THEN END;

out_of_balance EXCEPTION; BEGIN ... DECLARE out_of_balance EXCEPTION; BEGIN ... BEGIN ---------- Unterblock beginnt IF ... THEN RAISE out_of_balance; END IF; EXCEPTION WHEN out_of_balance THEN -- Fehlerbehandlung RAISE; -- Wiederauslösung END; ------------ Unterblock endet -- andere Fehlerbehandlung für Exc. END; Fehler kann im Ausnahmebehandlungsblock wieder ausgelöst werden, um im umschließenden Block behandelt zu werden Ruft aktuelle Exception noch einmal auf Bei Fehler in Cursor-FOR-LOOP wird Cursor vor Behandlung geschlossen kein Zugriff auf Cursor

7. Unterprogramme Prozeduren und Funktionen Unterprogrammblöcke mit Einteilungen Funktionen mind. 1 RETURN-Anweisungen (PROGRAM_ERROR) Entsprechen weitestgehend Unterprogrammen in anderen Programmiersprachen Deklarations-, Ausführungs-, Exceptionsbehandlungsteil PROGRAM_ERROR zur Laufzeit

Syntax {FUNCTION|PROCEDURE} name [(parameter[, parameter, ...])] RETURN datatype IS [local declarations] BEGIN executable statements [EXCEPTION exception handlers] END [name];

Parameter-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'); -- illegal Parameter können DEFAULT-Werte haben Beispiele 1 bis 3 korrekt Beispiel 4 falsch, wenn für Variable new_loc ‘New York‘ zugewiesen werden soll Beispiel 5 beschreiben

Positionelle vs. Benannte Notation DECLARE acct INTEGER; amt REAL; PROCEDURE credit_acct (acct_no INTEGER, amount REAL) IS ... BEGIN credit_acct(acct, amt); credit_acct(amount=>amt,acct_no=>acct); credit_acct(acct_no=>acct,amount=>amt); credit_acct(acct, amount => amt); credit_acct(acct_no => acct, amt); -- letztes Beispiel illegal Beim Aufruf relevant Positionelle Notation beschreiben Benannte Notation beschreiben Gemischte Notation Pfeil als Assoziationsoperator

Ein- und Ausgabeparameter IN (Standard), OUT und IN OUT IN-Parameter wie Konstante Keine Referenz bei OUT und IN OUT Referenz durch NOCOPY Beispiel: DECLARE TYPE Staff IS VARRAY(200) OF Employee; PROCEDURE reorganize (my_staff IN OUT NOCOPY Staff) IS ... IN-Parameter: können in Unterprogrammen nicht verändert werden Verursacht Kompilierungsfehler Wie Konstante Mit DEFAULT-Werten Variablen neu deklariert und Werte am Schluss übergeben Beispiel beschreiben Vorteile dürften bekannt sein

Stored Subprograms Werden in den Datenbanken gespeichert CREATE PROCEDURE CREATE FUNCTION Gespeicherte Unterprogramme

Aufruf von UP anderer Programmiersprachen I import java.sql.*; import oracle.jdbc.driver.*; public class Adjuster { public static void raiseSalary (int empNo, float percent) throws SQLException { Connection conn = new OracleDriver().defaultConnection();

Aufruf von UP anderer Programmiersprachen II String sql = "UPDATE emp SET sal = sal * ? WHERE empno = ?"; try { PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setFloat(1, (1 + percent / 100)); pstmt.setInt(2, empNo); pstmt.executeUpdate(); pstmt.close(); } catch (SQLException e) { …

Aufruf von UP anderer Programmiersprachen III Deklaration der Prozedur: CREATE PROCEDURE raise_salary (empno NUMBER, pct NUMBER) AS LANGUAGE JAVA NAME 'Adjuster.raiseSalary(int, float)';

8. Collections, Records und Objekte Felder, Listen, Bäume, etc. In PL/SQL Datentypen TABLE und VARRAY Ermöglichen indizierte Tabellen und variable Felder

Collections I Geordnete Gruppen von Elementen eines Datentyps TABLE Nested Tables: Elemente out-of-line in anderen Tabellen Größe dynamisch Elemente können herausgelöscht werden Deklaration: TYPE type_name IS TABLE OF element_type [NOT NULL] Indizierte Tabellen, nested tables Entsprechen Arrays anderer Programmiersprachen Nur eine Dimension Nested Tables: Unbegrenzt Enthalten Lücken Über Next-Funktion Nachfolger

Collections II Indizierte Tabellen: Varrays Deklaration: TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTEGER; Weniger Datentypen möglich Varrays Begrenzte maximale Größe Bei Deklaration NULL Konstruktor Rückgabewerte bei Funktionen Indizierte Tabellen: Besonders eigene Datentypen nicht möglich Varrays: Enthalten somit keine Elemente Über Konstruktor initialisieren Wie bei anderen Programmiersprachen Konstruktor ohne Elemente, Collection leer, aber nicht NULL

Collections III Können nicht verglichen werden Spezielle Methoden: EXISTS: if courses.EXISTS(i) THEN ... COUNT: tatsächliche Anzahl der Elemente LIMIT: maximalste Anzahl oder NULL FIRST und LAST PRIOR und NEXT EXTEND TRIM DELETE FIRST und LAST: Kleinste bzw. größte Indexnummer Wenn leer: NULL PRIOR und NEXT: Vorgänger bzw. Nachfolger NULL, wenn jeweils nicht vorhanden Bei nested tables (gelöschte Elemente) relevant EXTEND: Vergrößern der Größe 3 Möglichkeiten

Records Analog Records anderer PS Punktnotation %ROWTYPE Einlesen aus Tabelle Keine Speicherung in Datenbanken DECLARE TYPE TimeRec IS RECORD (hours SMALLINT, minutes SMALLINT); %ROWTYPE: stellt Record komplette Struktur zur Verfügung Tabellen und Cursor Selbstdefinierte Records Einzelne Felder wie Variablendeklaration mit NOT NULL und Standardwerten

Objektdatentypen Attribute Methoden Beispiel: CREATE TYPE Bank_Account AS OBJECT ( Acct_number INTEGER(5), balance REAL, MEMBER PROCEDURE open (amount IN REAL), MEMBER PROCEDURE close (num IN INTEGER, amount OUT REAL) );

9. Packages Objektschema, um logisch zusammengehörige Daten und Unterprogramme zu gruppieren 2 Teile: Spezifikation: Schnittstelle zu Applikationen Körper: Vollständige Definition von Cursor und Ups Private Deklarationen optional Spezifikation: Deklaration von Datentypen, Variablen, Konstanten, Exceptions, Cursor und Unterprogramme, die für User verfügbar Körper: Kann entfallen, wenn Package nur Variablen und Konstanten enthält

Vorteile Modularität und Datenkapselung Bessere Performance: Laden des gesamten Packages Wenn Package logisch zusammenhängend implementiert, werden Daten und Unterprogramme nacheinander benötigt Weniger Disk-I/O

Vordefinierte Packages STANDARD: Definiert PL/SQL-Umgebung Funktionen zur Berechnung DBMS_Standard DBMS_ALERT DBMS_OUTPUT DBMS_PIPE UTL_FILE UTL_HTTP

10. Cursor Temporäre Speicherung einer SELECT-Anweisung Keine, eine oder mehrere Zeilen 3 Kommandos: Öffnen: OPEN Bearbeiten: FETCH Schließen: CLOSE DECLARE CURSOR c1 IS SELECT empno, ename, job FROM emp WHERE deptno = 20; Spätere zeilenweise Berechnung Undeklarierte Bezeichner Keine Zuweisung Änderung nur durch Schließen und neues Öffnen mit anderen Eingangswerten Vergleich mit Dateioperationen (Filepointer entspricht Cursor) Keine Exception, wenn Hinauslesen über Zeilen OPEN: Führt Abfrage aus Setzt Rückgabe mit Cursornamen gleich Positioniert Cursor vor erste Zeile FETCH: Holt aktuelle Zeile Setzt Cursor auf nächste Zeile

Attribute I %FOUND: %NOTFOUND %ISOPEN Wenn Cursor geöffnet Vor erstem FETCH NULL FALSE, wenn letzter FETCH fehlgeschlagen %NOTFOUND %ISOPEN %ROWCOUNT: Anzahl Zeilen bei FETCH %FOUND: Wenn nicht geöffnet Exception %NOTFOUND: Gegenteil von %FOUND

Attribute II Auch bei INSERT, UPDATE, DELETE und SELECT INTO Beispiel: DELETE FROM emp WHERE ... IF SQL%ROWCOUNT > 10 THEN -- more than 10 rows were deleted ... END IF;