Kap. 1.2 Existierende Infrastruktur am Beispiel von Oracle9 • • • • PL/SQL Packages & Stored Procedures Verteilte Datenbanken (DB-Links) Verteilte Transaktionen Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 1 PL/SQL Procedural Language extensions to SQL • • • proprietäre 4GL-Sprache SQL erweitert um klassische Programmiersprachen-Konstrukte (turing-vollständiges SQL) PL/SQL erstmals 1991 in Oracle Version 6.0 von Oracle-DB-Servern unterstützt Dient unter anderem zur Entwicklung von Stored Procedures in Oracle • Anwendungen, die in der DB gespeichert, verwaltet und auch dort ausgeführt werden Ab Version 8i: Java VM innerhalb der DB – Java als Alternative zu PL/SQL möglich Manuals: http://www.dbs.ethz.ch/oracle8/ Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 2 PL/SQL-Block Header • Block Header IS Declaration Section Declaration Section: Angabe aller verwendeter • Variablen • Cursors • Sub-Blöcke BEGIN Execution Section EXCEPTION Exception Section END; Execution Section • Programm-Code Exception Section • • Objektverwaltung höherer Ordnung (OHO) – SS 2002 Name des Blocks Ausnahmeverarbeitung bei Fehlern Warnungen Kapitel 1: Workshop Oracle9 – 3 Header Procedure, Function PROCEDURE name ( parameter, parameter, ...) IS FUNCTION name ( parameter, parameter, ...) RETURN type IS Parameter • Variable Name, Direction, Type Dummy1 IN NUMBER, Dummy2 OUT NUMBER Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 4 Datentypen Numerisch • BINARY_INTEGER, NATURAL Zeichenketten • CHAR, VARCHAR2, LONG Binärdaten • RAW, INTEGER, SMALLINT, INT, POSITIVE, LONG RAW Verschiedenes • ROWID, BOOLEAN, DATE, NULL, CURSOR, TABLE Verankerte Datentypen (Anchored) • %TYPE, %ROWTYPE Konvertierung zwischen Datentypen • • Implizit explizit über Konvertierungsfunktionen: TO_CHAR, TO_NUMBER, TO_DATE, CHARTOROWID, CONVERT HEXTORAW, RAWTOHEX, ROWIDTOCHAR Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 5 Declaration Section Deklaration von Variablen, Cursors, Subtypen, Records, Tables variable_name NUMBER (2) [:= value]; variable_name NUMBER (2) [DEFAULT value]; variable_name schema.name%TYPE; • • Deklaration, ohne den genauen Datentyp zu kennen (automatische Übernahme aus dem DB-Katalog) Prozedur ist von späteren Änderungen des Datentyps in der entsprechenden Tabelle nicht betroffen TYPE type_name IS RECORD ( name1 typ1, name2 typ2, ...); TYPE type_name IS TABLE OF type; SUBTYPE subtype_typname IS base_type; Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 6 Cursors Eine Besonderheit von PL/SQL ist, dass immer nur einzelne Tupel zurückgegeben werden können, aber keine Mengen • Abhilfe: Cursor « Iteration über eine Tupelmenge innerhalb der DB und Auslesen einzelner Tupel • • • • • Deklaration: – CURSOR c1 IS SELECT empno, ename, sal FROM emp; – CURSOR c2 RETURN dept%ROWTYPE IS SELECT * FROM dept WHERE deptno = 10; Öffnen: OPEN c1; Auslesen: FETCH c1 INTO my_empno, my_ename, my_sal; Schliessen: CLOSE c1; Attribute: %ISOPEN, %FOUND, %NOTFOUND, %ROWCOUNT Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 7 Wertübergabe DECLARE qty_on_hand NUMBER(5); new_order_id NUMBER(5); ... BEGIN SELECT quantity INTO qty_on_hand FROM inventory WHERE product = 'TENNIS RACKET'; ... new_order_id := 42; ... INSERT INTO ORDER(order_id, orderitem) VALUES (new_order_id, this_orderitem); Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 8 Kontrollstrukturen: Verzweigungen, Schleifen Verzweigungen: • IF • IF • IF – THEN - END IF; – THEN – ELSE - END IF; – THEN – ELSIF – THEN - ELSE - END IF; Schleifen: • LOOP - EXIT WHEN - END LOOP; • FOR counter IN start ... end LOOP • WHILE predicate LOOP - END LOOP; Objektverwaltung höherer Ordnung (OHO) – SS 2002 - END LOOP; Kapitel 1: Workshop Oracle9 – 9 Zusätzlich: Built-in Functions Character Functions • Date Functions • ADD_MONTHS, LAST_DAY, MONTHS_BETWEEN, NEW_TIME, NEXT_DAY, ROUND, SYSDATE, TRUNC Numeric Functions • ASCII, CHR, CONCAT, INITCAP, INSTR, LENGTH, LOWER, LPAD, LTRIM, REPLACE, RPAD, RTRIM, SOUNDEX, SUBSTR, TRANSLATE, UPPER ABS, ACOS, ASIN, ATAN, ATAN2, CEIL, COS, COSH, EXP(n), FLOOR, LN(a), LOG(a,b), MOD(a,b), POWER(a,b), ROUND(a,b), SIGN(a), SIN, SINH, SQRT, TAN, TAHH, TRUNC(a,b), DUMP, GREATEST, LAST, NVL, SQLCODE, SQLERRM, UID, USER, USERENV, VSIZE Built-In Packages • DBMS_STANDARD, DBMS_ALERT, DBMS_DDL, DBMS_JOB, DBMS_LOCK, DBMS_MAIL, DBMS_OUTPUT, DBMS_PIPE, DBMS_SESSION, DBMS_SNAPSHOT, DBMS_SQL, DBMS_TRANSACTION, DBMS_UTILITY Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 10 Exception Section Möglichkeit, auf vordefinierte Ausnahmen und auch auf individuell deklarierte (und explizit anzustossende) Ausnahmen zu reagieren DECLARE my_exception EXCEPTION; BEGIN ... IF ... THEN RAISE my_exception; ... EXCEPTION WHEN ZERO_DIVIDE THEN -- vordefinierte Ausnahme INSERT INTO ... VALUES ...; COMMIT; WHEN my_exception THEN Update ... SET ... ; ... WHEN OTHERS THEN ROLLBACK; END; -- Default-Fehlerbehandlung Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 11 Packages Logisch zusammengehörige Prozeduren/Funktionen, die in der DB gespeichert werden, lassen sich in Packages zusammenfassen Eine Package besteht aus zwei Teilen: • • Spezifikation – globale Variablen – Konstanten – Interfaces der Funktionen und Prozeduren Body – Implementation der Prozeduren bzw. Funktionen Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 12 Packages & Stored Procedures – Beispiel CREATE PACKAGE emps AS PROCEDURE hire (empno INTEGER, empname VARCHAR2(50)) END emps; Spezifikation CREATE PACKAGE BODY emps AS PROCEDURE hire (empno INTEGER, empname VARCHAR2(50)) IS BEGIN INSERT INTO employees VALUES (empno, empname); END hire; END emps; Implementation Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 13 Verteilte Datenbanken (DB-Links) Verteilte Datenbank in Oracle-Terminologie: • • Homogene Konfiguration verschiedener Oracle-DB-Server Verbindung zu DB-Servern – direkt (via Applikation) – indirekt (via Datenbank-Link) Datenbank-Link • • unidirektionale Kommunikation zwischen DB-Servern basierend auf Net8 (Netzwerkprotokoll von Oracle) Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 14 DB-Links (Beispiel) CREATE [PUBLIC|SHARED] DATABASE LINK Sales.inf.ethz.ch [CONNECT TO user IDENTIFIED BY password | CONNECT TO CURRENT_USER] USING ‘SALES’; SELECT s.QoH FROM Stock s, [email protected] o WHERE s.product_ID = o.product_ID DB Server (“PRODUCTS”) DB Server (“SALES”) Net8 Net8 Netzwerk Database Link Stock Objektverwaltung höherer Ordnung (OHO) – SS 2002 Orders Kapitel 1: Workshop Oracle9 – 15 Datenbank-Links – Eigenschaften … Datenbank-Link ermöglicht Zugriff auf sämtliche Schema-Objekte (Tabellen, Views, Stored Procedures, etc.) des Remote-DB-Servers Optionen von DB-Links • • Gültigkeit – Private: Link gilt nur für den Benutzer, der den Link angelegt hat – Public: für die Allgemeinheit verfügbarer Link Zugriffsschutz – Fixed User: Benutzer & Passwort werden bereits im DB-Link angegeben; jeder Zugriff über DB-Link erfolgt auf das Schema des fixed users in der Remote-DB – Connected User: Der DB-Link führt zum Schema des Benutzers, der den Link verwendet (der am lokalen DB-Server angemeldet ist). Voraussetzung ist, dass dieser Benutzer an beiden DB-Servern bekannt ist – Current User: Der DB-Link wird im Kontext des aktuellen Schemas ausgeführt (z.B. beim Aufruf einer Stored Procedure, die einen DB-Link beinhaltet, im Kontext des Benutzers der die Prozedur definiert hat, nicht in dem des Aufrufenden) Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 16 … Datenbank-Links – Eigenschaften Jeder Zugriff auf den Remote-DB-Server via DB-Link baut eine eigene Connection auf • • Grosser Overhead Abhilfe: Shared Database Links Shared Database Links • • Voraussetzung: lokaler Server muss im multi-threaded-mode (MTS) konfiguriert sein (Oracle-Terminologie für multiplen Server mit asymmetrischer Konfiguration, d.h. mit dynamischer Zuteilung von Anwendungsprozessen an Server-Prozesse) Netzwerkverbindung zum Remote-Server kann von allen Benutzern, die von einem Server-Prozess bearbeitet werden, wiederverwendet werden Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 17 Zugriff auf Oracle-Objekte [schema_name.][pkg_name.]object_name[@dblink_name] [params] Tabellen: • • (Tabelle in eigenem Schema) (Zugriff via DB-Link) Prozeduren: • • Select * from konto; Select * from [email protected]; Aus SQL-Frontend (sqlplus) – Execute user.emps.hire(10, ‘Bill Gates’); – Execute [email protected](100, 5004); Aus einer anderen Prozedur (execute nicht erforderlich) – [email protected](100, 5004); Funktionen: • • Aus SQL-Frontend (sqlplus) – Select user.emps.foo( 10, empno) from emp; (Funktion foo wird für jedes Tupel von emp aufgerufen) – Select [email protected](‘Ogi’) from Dual; Aus einer anderen Prozedur bzw. Funktion – [email protected](‘Ogi’); Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 18 Verteilte Transaktionen In verteilten DB-Umgebungen wendet Oracle8 automatisch ein (modifiziertes) 2PC-Protokoll an Zwei-Phasen-Commit-Protokoll (2PC) Ziel: Garantie der Atomarität verteilter Transaktionen • • • Phase 1: – Koordinator initiiert verteilte Transaktion und ermittelt Erfolg/Misserfolg (schickt prepare-Statement an alle Komponenten; diese antworten gemäss dem Ergebnis ihrer lokalen Subtransaktion mit „prepared“ oder „abort“) – Agentensysteme geben Garantie ab, falls Transaktion lokal erfolgreich abgeschlossen werden kann (prepared) Phase 2: – Koordinator ermittelt globale Commit-Entscheidung – Jede Komponente muss diese Entscheidung umsetzen (führt je nach Koordinatorentscheid lokal Commit/Abort durch) genaue Beschreibung in IS-K Unterlagen Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 19 Oracle 2PC - Terminologie Globaler Koordinator: DB-Server, der verteilte Transaktion initiiert (erster Aufruf via DB-Link) Lokaler Koordinator: DB-Server (≠ globaler Koordinator), der wiederum Daten in Remote-DBServern referenziert (geschachteltes 2PC) Commit Point Strength • Jedem Knoten wird bei Konfiguration ein Gewicht “Commit Point Strength” [0…255] zugewiesen (erfolgt bei der Installation/Konfiguration der DB) Commit Point Site • • Knoten mit grösstem Gewicht Muss nicht in Prepared-Zustand übergehen Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 20 Oracle 2PC - Beispiel-Ablauf … Konfiguration (“Transaktionsbaum”) • • • • n Knoten (= DB-Server) Globaler Koordinator Lokaler Koordinator Commit Point Site SALES.dbs.ethz.ch (45) WAREHOUSE.dbs.ethz.ch (165) FINANCE.dbs.ethz.ch (60) Objektverwaltung höherer Ordnung (OHO) – SS 2002 HQ.dbs.ethz.ch (145) HR.dbs.ethz.ch (45) Kapitel 1: Workshop Oracle9 – 21 … Oracle 2PC - Beispiel-Ablauf … BEGIN INSERT INTO orders o VALUES …; EXECUTE [email protected]; UPDATE [email protected] SET …; COMMIT; CREATE PACKAGE BODY admin SALES.dbs.ethz.ch (45) WAREHOUSE.dbs.ethz.ch (165) FINANCE.dbs.ethz.ch (60) AS ( PROCEDURE man ( … BEGIN UPDATE balance@FINANCE… SET …; INSERT INTO management HQ.dbs.ethz.ch VALUES …; (145) UPDATE employees@HR… SET …; Commit; END man; …) HR.dbs.ethz.ch (45) Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 22 … Oracle 2PC - Beispiel-Ablauf Globaler Koordinator schickt prepare-Nachricht an (n-1) Knoten (ohne Commit Point Site) hier: HQ & SALES Lokaler Koordinator (HQ) verschickt prepare an FINANCE & HR Bei Commit-Entscheidung erfolgt Commit in Commit Point Site (WAREHOUSE) Bei Commit in WAREHOUSE auch Commit der verteilten Transaktion, ansonsten Rücksetzen Objektverwaltung höherer Ordnung (OHO) – SS 2002 SALES WAREHOUSE HQ FINANCE HR Kapitel 1: Workshop Oracle9 – 23 Oracle 2PC - Zusammenfassung Transparente Verwendung von 2PC in verteilten Datenbanken Verteilte Transaktionen auch in heterogenen DatenbankUmgebungen möglich • • DB-Link kann auch zu Nicht-Oracle-DB-Servern eingerichtet werden – Voraussetzung: transparente Umsetzung zwischen unterschiedlichen SQL-Dialekten durch speziellen “Agenten”, der für jedes einzubindende Nicht-Oracle-System bereitgestellt werden muss Teilnahme an verteilten Transaktionen je nach Eigenschaften des Nicht-Oracle-Systems – Voraussetzung für 2PC: X/A Interface – Ansonsten: Nur Teilnahme als Commit Point Site bzw. nur Read-Only Transaktionen erlaubt Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 24 „TP-Lite“-2PC am Beispiel von Pseudo PL/SQL CREATE PACKAGE BODY banking AS PROCEDURE transfer (int amount, int account_from, int account_to) IS BEGIN ... execute debit@bern(amount, account_from) IF ... THEN RAISE fehler; // Fehlerbehandlung ... execute credit@basel(amount, accout_to) IF ... THEN RAISE fehler; // Fehlerbehandlung ... execute PREPARECommit@bern IF ... THEN RAISE fehler; execute PREPARECommit@basel IF ... THEN RAISE fehler; // Fehlerbehandlung ... // Fehlerbehandlung ... // alles ist ok execute Commit@bern; execute Commit@basel; execute Globale Transaktion; EXCEPTION WHEN fehler THEN ... execute Abort@bern; execute Abort@basel; Weiterhin: Logging im Koordinator nötig für korrekte Rücksetzbarkeit. // ROLLBACK; Dies ist hier allerdings nicht dargestellt. ... Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 25 Beispielszenario der praktischen Übung Tabelle account_bern Tabelle customer_bern Tabelle account Tabelle customer Tabelle Kunde Tabelle Konto Package bank_transfer Prozedur transfer Package ks_banking Prozeduren abheben Package withdraw_deposit einzahlen Prozeduren withdraw deposit DB-Link STUD3.inf.ethz.ch DB-Link STUDOHO.inf.ethz.ch selbst anzulegen (in schema_VBS_ZH.sql) Alias: ks_banking, ks_konto [email protected]() bereits vorgegeben Package finance Prozeduren debit credit STUD3 VBS-Filiale Bern STUD2 STUD6 VBS-Filiale Zürich KS-Datenbank Objektverwaltung höherer Ordnung (OHO) – SS 2002 Kapitel 1: Workshop Oracle9 – 26