Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Datenbank-Zugriffsschnittstellen am Beispiel von Oracle und PL/SQL.

Ähnliche Präsentationen


Präsentation zum Thema: "Datenbank-Zugriffsschnittstellen am Beispiel von Oracle und PL/SQL."—  Präsentation transkript:

1 Datenbank-Zugriffsschnittstellen am Beispiel von Oracle und PL/SQL

2 © Prof. T. Kudraß, HTWK Leipzig Kommunikation mit der Datenbank Vorbereiten einer SQL-Anweisung Freigabe der Ressourcen Verbindungsaufbau Lesen der Ergebnismenge Verbindungsabbau Ausführung einer Anweisung

3 © Prof. T. Kudraß, HTWK Leipzig Überblick Datenbank-Zugriff Datenbankzugriff mit PL/SQL Server Pages (PSP) Zugriff auf Metadaten in PL/SQL Dynamisches SQL – Parametrisierung von Anfragen – Dynamischer Aufbau von WHERE-Bedingungen – Dynamische SELECT- und FROM-Klausel

4 © Prof. T. Kudraß, HTWK Leipzig Entwicklung von PL/SQL Server Pages (PSP) 1. Schreiben der PL/SQL Server Page Standard-Skripttag Spezielle Skripttags: - Pages - Prozeduren - Parameter - Deklarationen - Expression Blocks - Include - Kommentare 2. Kompilieren der PSP-Datei als Stored Procedure 3. Aufruf der PSP im Browser

5 © Prof. T. Kudraß, HTWK Leipzig Standard-Skripttag Funktion: Begrenzung von PL/SQL- Anweisungen Inhalt: beliebige PL/SQL-Statements, z.B. Prozeduraufrufe Syntax

6 © Prof. T. Kudraß, HTWK Leipzig Spezielle Tags: Page Direktive Funktion: Charakterisierung der PSP Attribute: – language: verwendete Skriptsprache (PL/SQL Standard) – contentType: Inhaltstyp der Seite; text/html Standard – errorPage: PSP-Seite, die auf auftretenden Fehlern aufgerufen wird (Standard: keine Datei) <% page [language=PL/SQL] [contentType=content type string] [errorPage=file.psp] %> <% page [language=PL/SQL] [contentType=content type string] [errorPage=file.psp] %> Syntax

7 © Prof. T. Kudraß, HTWK Leipzig Spezielle Tags: Procedure & Parameter Direktive Funktion: Spezifikation von Prozedur und Parameter (alles IN) Attribute: – procedure: Name des Prozedur – parameter: Name des Parameters – type: Datentyp des Parameters; Standardwert varchar2 (ohne Länge) – default: Standardwert für Parameter Syntax [type=PL/SQL datatype] [default=value] %> [type=PL/SQL datatype] [default=value] %>

8 © Prof. T. Kudraß, HTWK Leipzig Spezielle Tags: Declaration Direktive Funktion: Deklaration von Variablen und Cursor auf der ganzen Seite Beispiel: <%! PL/SQL declaration; [PL/SQL declaration;]... %> <%! PL/SQL declaration; [PL/SQL declaration;]... %> Syntax <%! cursor prod_cur is select * from products where price between minprice and´maxprice vc_name varchar2(200):=Peter; %> <%! cursor prod_cur is select * from products where price between minprice and´maxprice vc_name varchar2(200):=Peter; %>

9 © Prof. T. Kudraß, HTWK Leipzig Spezielle Tags: Expression Block / Print Direktive Funktion: Ausgabe eines beliebigen PL/SQL-Ausdrucks (String, Zahl, Ergebnis eines Funktionsaufrufs) Beispiel: Syntax oder The employee name is oder The employee name is

10 © Prof. T. Kudraß, HTWK Leipzig Spezielle Tags: Include Direktive Funktion: Einbinden des Quelltexts anderer Dateien in die Seite Beispiel: Syntax Anmerkungen: - Datei darf HTML- und PSP-Skriptelemente enthalten - Einbindung nur einmal zur Übersetzungszeit (mögliche Alternative: Einbindung durch Prozeduraufruf)

11 © Prof. T. Kudraß, HTWK Leipzig Spezielle Tags: Kommentare Funktion: erscheint nicht in der generierten Prozedur bzw. in den daraus erstellten HTML-Seiten Syntax Syntax Funktion: Kommentare, die in der HTML-Ausgabe erscheinen (normale HTML-Syntax) -- einzeiliger Kommentar /* mehrzeiliger Kommentar */ -- einzeiliger Kommentar /* mehrzeiliger Kommentar */ Syntax Funktion: Kommentare innerhalb eines PL/SQL-Blocks

12 © Prof. T. Kudraß, HTWK Leipzig Kompilieren der PL/SQL Server Page loadpsp [-replace] - user [include_file_name...] [... ] loadpsp [-replace] - user [include_file_name...] [... ] Syntax Beispiel loadpsp -replace - user timestamp.inc display_cust.psp loadpsp -replace - user timestamp.inc display_cust.psp Attribute: - replace: überschreibt Prozedur gleichen Namens - Login-Information - include-file_name: Dateien, die mittels include eingebunden werden - page1...: Name der PSP-Dateien, die kompiliert werden sollen

13 © Prof. T. Kudraß, HTWK Leipzig Parameterverarbeitung GET-Methode Beispiel: cust_order_items?ord_id=100&cust_id=100 cust_order_items?ord_id=100&cust_id=100 URL bei Submit:

14 © Prof. T. Kudraß, HTWK Leipzig Parameterverarbeitung POST-Methode Beispiel: cust_order_items cust_order_items URL bei Submit:

15 © Prof. T. Kudraß, HTWK Leipzig Parameterübergabe SELECT-Box wird durch Abfrage auf Tabelle Products mit Werten gefüllt, Zuordnung zum Parameter p_ID 2. Eingabeparameter: p_Name als Input-Textfeld in HTML-Formular Eingabe:...

16 © Prof. T. Kudraß, HTWK Leipzig Fehlerbehandlung - Verwendung von Errorpages erwartete vs. unerwartete Fehler erwarteter Fehler: NO_DATA_FOUND unerwarteter Fehler: 2 Produkte mit der gleichen ID Verwendung von ErrorPage in Page-Direktive zur Behandlung unerwarteter Fehler Nachteil: keine Parameterübergabe möglich (z.B. Fehlerzeitpunkt, Eingabeparameter) EXCEPTION WHEN OTHERS THEN htp.init; error; END; -- error: Name der Fehlerseite

17 © Prof. T. Kudraß, HTWK Leipzig Benutzerdefinierte Ausnahmebehandlung (Exceptions) -- Angabe der Fehlerseite... l_exception EXCEPTION; -- Deklaration der Ausnahme l_exception... IF (TO_DATE(arrival_date,'YYYY-MM-DD') <= SYSDATE) THEN RAISE l_exception; -- Datum liegt vor dem aktuellem Datum END IF; EXCEPTION WHEN l_exception THEN -- Test, ob es der vom Benutzer ausgelöste Fehler ist RAISE; -- Weiterleitung des Fehlers an übergeordnete Fehler- END; -- behandlung in Error_Page Ausgabe der Fehlermeldung -- wenn anderer Fehler, Ausgabe der Fehlermeldung...

18 © Prof. T. Kudraß, HTWK Leipzig Zusammenfassendes Beispiel: Ausgabe einer Kursliste Titel Leiter Tag Zeit von Zeit bis Ort Plätze <% FOR ds IN (SELECT Kurse.*, Kl_Name ||, || Kl_Vorname AS Kl_Fullname, Kl_ FROM Kurse LEFT JOIN Kursleiter ON Kurs_Leiter_ID_FK=Kl_ID ORDER BY Kurs_Name) LOOP%> Titel Leiter Tag Zeit von Zeit bis Ort Plätze <% FOR ds IN (SELECT Kurse.*, Kl_Name ||, || Kl_Vorname AS Kl_Fullname, Kl_ FROM Kurse LEFT JOIN Kursleiter ON Kurs_Leiter_ID_FK=Kl_ID ORDER BY Kurs_Name) LOOP%>

19 © Prof. T. Kudraß, HTWK Leipzig Zusammenfassendes Beispiel: Ausgabe einer Kursliste (Forts.) ||ds.Kurs_Name|| %> ||ds.Kl_Fullname|| %> ||ds.Kurs_Wochentag|| %> ||ds.Kurs_Zeitvon|| %> ||ds.Kurs_Zeitbis|| %> ||ds.Kurs_Ort|| %> || ds.Kurs_AktTeiln||/ ||ds.Kurs_MaxTeiln|| %> ||ds.Kurs_AktTeiln||/ ||ds.Kurs_MaxTeiln|| %> ||ds.Kurs_Name|| %> ||ds.Kl_Fullname|| %> ||ds.Kurs_Wochentag|| %> ||ds.Kurs_Zeitvon|| %> ||ds.Kurs_Zeitbis|| %> ||ds.Kurs_Ort|| %> || ds.Kurs_AktTeiln||/ ||ds.Kurs_MaxTeiln|| %> ||ds.Kurs_AktTeiln||/ ||ds.Kurs_MaxTeiln|| %>

20 © Prof. T. Kudraß, HTWK Leipzig Ausgabe der PSP-Beispielseite

21 © Prof. T. Kudraß, HTWK Leipzig Überblick Datenbank-Zugriff Datenbankzugriff mit PL/SQL Server Pages (PSP) Zugriff auf Metadaten Dynamisches SQL – Parametrisierung von Anfragen – Dynamischer Aufbau von WHERE-Bedingungen – Dynamische SELECT- und FROM-Klausel

22 © Prof. T. Kudraß, HTWK Leipzig Zugriff auf Metadaten in PL/SQL Zugriff auf Metadaten über Views des Oracle Data Dictionary = Sichten auf zugrundeliegende Systemtabellen, z.B. all_tab_columns, all_objects, all_tables Definierte Schnittstelle unabhängig von der DBMS-Version FOR ds IN ( SELECT table_name, column_name, data_type, data_length, nullable FROM all_tab_columns WHERE OWNER=THOMAS AND TABLE_NAME=STUDENTEN ORDER BY column_id ) LOOP htp.prn( Tabellenname: ||ds.Table_Name|| ); htp.prn( Spaltenname: ||ds.Column_Name|| ); htp.prn( Datentyp: ||ds.Data_Type|| ); htp.prn( Laenge: ||ds.data_length|| ); htp.prn( isNullable: ||ds.nullable|| ); END LOOP; %>

23 © Prof. T. Kudraß, HTWK Leipzig Zugriff auf Metadaten eines Result Set in PL/SQL Nutze das Package DBMS_SQL Parsen der SQL-Anweisung cur := dbms_sql.open_cursor; -- Parsen der Anfrage, DMBS_SQL.native wird für alle Oracle- -- Datenbanken > Version7 verwendet dbms_sql.parse(cur,SELECT * FROM studenten,DBMS_SQL.native); -- Ausführen der Anfrage i := dbms_sql.execute(cur); Zugriff auf Metadaten des Resultset dbms_sql.describe_columns(cur, spaltenanzahl, ds); type desc_rec is record ( col_type BINARY_INTEGER := 0, col_max_len BINARY_INTEGER := 0, col_name VARCHAR2(32) :=, col_null_ok BOOLEAN := TRUE);

24 © Prof. T. Kudraß, HTWK Leipzig Zugriff auf Metadaten eines Result Set in PL/SQL (Forts.) Ausgabe der Metadaten -- hole ersten Datensatz rec := ds.first; IF (rec is not null) THEN LOOP htp.prn( Spaltenname: ||ds(rec).col_name || ); htp.prn( Datentyp: ||ds(rec).col_type || ); htp.prn( Laenge: ||ds(rec).col_max_len|| ); IF (ds(rec).col_null_ok) THEN htp.prn( isNullable: true ); ELSE htp.prn( isNullable: false ); END IF; htp.prn( ); -- naechster Datensatz rec := ds.next(rec); EXIT WHEN (rec is null); END LOOP; END IF;

25 © Prof. T. Kudraß, HTWK Leipzig Zugriff auf Metadaten in JDBC (Datenbank) Klasse DatabaseMetaData enthält Informationen über das spezifische DBMS, z.B. – Datenbank-Version – maximale Zeichenkettenlänge für Bezeichner – unterstützte Funktionen (z.B. EXISTS-Subquery) – unterstützte Datentypen Beispiel DatabaseMetaData md = conn.getMetaData(); ResultSet rset = md.getTables(null,"THOMAS",null, null); while (rset.next()) { out.println("Schema: "+rset.getString("TABLE_SCHEMA")+", "); out.println("Tabellenname: " + rset.getString("TABLE_NAME")+" "); } Schema: THOMAS, Tabellenname: KURSE Schema: THOMAS, Tabellenname: KURSLEITER...

26 © Prof. T. Kudraß, HTWK Leipzig Zugriff auf Metadaten in JDBC (ResultSet) Klasse ResultSetMeta Data enthält Informationen über das Ergebnis einer Anfrage, z.B. – Anzahl Spalten – Spaltenname und Datentyp – Eigenschaften wie Zulässigkeit von Nullwerten Beispiel Statement stmt = conn.createStatement (); ResultSet rsetQuery = stmt.executeQuery ("SELECT * FROM Kurse ORDER BY Kurs_Name"); ResultSetMetaData rsmetadata = rsetQuery.getMetaData(); int spalten = rsmetadata.getColumnCount(); for (int i=1;i<=spalten;i++) { out.println("Spaltenname: "+rsmetadata.getColumnName(i)+" "); out.println("Datentyp: "+rsmetadata.getColumnType(i)+" "); out.println("Laenge: "+rsmetadata.getPrecision(i)+" "); out.println("isNullable: "+rsmetadata.isNullable(i)+" "); }

27 © Prof. T. Kudraß, HTWK Leipzig Überblick Datenbank-Zugriff Datenbankzugriff mit PL/SQL Server Pages (PSP) Zugriff auf Metadaten Dynamisches SQL – Parametrisierung von Anfragen – Dynamischer Aufbau von WHERE-Bedingungen – Dynamische SELECT- und FROM-Klausel

28 © Prof. T. Kudraß, HTWK Leipzig Unterstützung dynamischer Anfragen Dynamische Belegung von Werten in der WHERE-Klausel (durch Parametrisierung) Dynamischer Aufbau der WHERE-Bedingung (d.h. variable Spalten) Dynamischer Aufbau der zu selektierenden Spalten (SELECT-Liste) bzw. Tabellen (FROM-Klausel)

29 © Prof. T. Kudraß, HTWK Leipzig Dynamische Zusammenstellung einer Anfrage Ansatz 1: Nutzung von Zeichenkettenfunktionen in der jeweiligen Sprache Ansatz 2: Verwendung des Oracle-Pakets DBMS_SQL Anwendungsbeispiel: Dynamische Anzeige von Studentendaten mit vorgegebener Matrikel-Nr. und vom Benutzer wählbarer Spalten

30 © Prof. T. Kudraß, HTWK Leipzig Anwendungsbeispiel

31 © Prof. T. Kudraß, HTWK Leipzig Realisierung mit DBMS_SQL Package in PL/SQL [...] Matrikelnummer: Name [...] Liste der Checkboxen in HTML

32 © Prof. T. Kudraß, HTWK Leipzig Realisierung mit DBMS_SQL Package in PL/SQL (2) Erstellung und Ausführung der dynamischen SQL- Anweisung in PSP Programm Speichere die Namen aller selektierten Spalten in einer Zeichenkette FOR i IN 1..spalten.count LOOP IF (i=spalten.count) THEN spalten_all := spalten_all || spalten(i); ELSE spalten_all := spalten_all || spalten(i) ||,; END IF; END LOOP;

33 © Prof. T. Kudraß, HTWK Leipzig Realisierung mit DBMS_SQL Package in PL/SQL (3) c := dbms_sql.open_cursor; Öffnen des Cursors für weitere Ausführung der dynam. Anfrage DBMS_SQL.PARSE(c, SELECT ||spalten_all|| FROM studenten WHERE stud_matrikel = :matrikel, dbms_sql.native); DBMS_SQL.BIND_VARIABLE(c, :matrikel, matrikel); Parsen der Anfrage und Parameterbindung Definiere eine Spalte für jede selektierte Spalte im Cursor FOR i IN 1..spalten.count LOOP DBMS_SQL.DEFINE_COLUMN(c, i, value_string, 30); END LOOP;

34 © Prof. T. Kudraß, HTWK Leipzig Realisierung mit DBMS_SQL Package in PL/SQL (4) DBMS_SQL.execute(c); [...] FOR i IN 1..spalten.count LOOP htp.print( ||spalten(i)|| ); END LOOP; Ausführung der Anfrage – Ausgabe des Tabellenkopfes Hinweis: Neben DBMS_SQL auch native dynamic SQL in Oracle verfügbar

35 © Prof. T. Kudraß, HTWK Leipzig Realisierung mit DBMS_SQL Package in PL/SQL (5) Lese jede Ergebniszeile mittels ( DBMS_SQL.FETCH_ROWS ) Pro Zeile: Lese alle Spaltenwerte (Out-Param value_string ) LOOP IF DBMS_SQL.FETCH_ROWS(c)>0 THEN htp.print( ); FOR i IN 1..spalten.count LOOP DBMS_SQL.COLUMN_VALUE(c, i, value_string); htp.print( ||value_string|| ); END LOOP; htp.print( ); ELSE exit; END IF; END LOOP; -- Nach Ergebnisausgabe: Cursor schliessen DBMS_SQL.CLOSE_CURSOR(c);

36 © Prof. T. Kudraß, HTWK Leipzig Transaktionsunterstützung Autocommit-Modus – bedeutet: Jedes SQL-Statement als individuelle Transaktion behandelt – neue Connections sind im Autocommit-Modus – Ausschalten des Autocommit-Modus JDBC: conn.setAutoCommit(false) – Transaktionskontrolle ohne Autocommit-Modus JDBC: conn.commit() conn.rollback()


Herunterladen ppt "Datenbank-Zugriffsschnittstellen am Beispiel von Oracle und PL/SQL."

Ähnliche Präsentationen


Google-Anzeigen