embedded SQL Embedded SQL (abgekürzt: ESQL) ist eine Spracherweiterung von SQL, mit der es möglich ist, SQL-Anweisungen innerhalb einer strukturierten oder objektorientierten Programmiersprache (der Hostsprache) auszuführen. Embedded SQL wurde erstmals im SQL92- Standard definiert.
Quelltext mit SQL-Befehlen SQL LIB STD LIB Quelltext in reiner host language Objektdatei Ausführbares Programm Precompiler Compiler Linker
embedded SQL Unabhängig von der Hostsprache kann zwischen statischem und dynamischem SQL unterschieden werden. statisches SQL: SQL-Anweisung wird zum Zeitpunkt der Programmierung festgelegt dynamisches SQL: SQL-Anweisung wird erst zum Zeitpunkt der Programmausführung erstellt
Beispiele! Syntax C Variablen beginnen mit : EXEC SQL EXECUTE IMMEDIATE SELECT * FROM :tablename; dynamisch statisch EXEC SQL SELECT * FROM mytable WHERE ID = :value; EXEC SQL EXECUTE IMMEDIATE SELECT :colname FROM mytable; dynamisch
CLI Call Level Interface
Definition Das Call Level Interface (kurz CLI) ist eine Datenbankschnittstellen-Spezifikation für den Zugriff auf RDBMS (baut auf SQL auf) aus anderen Anwendungen heraus. Weitere Details unter: http://www.opengroup.org/products/publications/catalog/c451.htm PDF des Technical Standards von 1995! ~320 Seiten
Nebel im Akronym Dschungel 2) CLI - Calling Line Identification 3) CLI - Clear Interrupt Flag 4) CLI - Client Library Interface 5) CLI - Command Line Interface 6) CLI - Command Line Interpreter 7) CLI - Common Language Interface
Anwendung 1 Elementare Zugriffsoperationen Anwendung 2 Elementare Zugriffsoperationen Anwendung 3 Elementare Zugriffsoperationen Anwendung 1 Zugriffsoperation en in Progr.- Sprache enthalten Anwendung 2 Zugriffsoperation en in Progr.- Sprache enthalten Call Level Interface Anwendung 3 Zugriffsoperation en in Progr.- Sprache enthalten Datenbank- Managementsystem (DBMS) DBS Datenbank- Managementsystem (DBMS) DBS Datenbank (DB) Datenbank (DB)
Vorteile CLI zu ESQL Kein Präcompiler nötig. Vorteil für Client/Server Architektur, da unabhägig(er) von Zieldatenbank Anwendung 1 Anwendung 2 Anwendung 3 Call Level Interface Oracle IBM DB2 Datenbank (DB) Datenbank (DB)
Zum Selberlesen Die CLI-Implementierung bildet die Befehlssätze verschiedener DBMS auf eine immer gleiche Funktionsbibliotek ab. für das Programm an sich ist es unwichtig, mit welcher Datenbank es arbeitet. Das CLI hat also die Funktion eines Übersetzers, der Programmaufrufe in eine Sprache übersetzt, die die Datenbank versteht und umgekehrt Daten, die von der Datenbank zurückgeliefert werden, so formatiert, dass sie vom Programm verarbeitet werden können.
Programmierschnittstellen, die das CLI- Konzept umsetzen (CLI-Implementierungen), sind z.b.: Open Database Connectivity (ODBC), Java Database Connectivity (JDBC).
ODBC ODBC wurde für C bzw. Cobol entwickelt nicht objekt-orientiert. Im Betriebssystem müssen DSN (data source name) für die Datenquellen angelet werden, über die zugegriffen werden kann. Zugriff bei ODBC erfolgt über OS ODBC nicht so gut für Java! + Konkurenz zwischen Microsoft (ODBC) und SUN (JDBC)
#!/usr/bin/perl Beispiel in Perl # Define the DSN $DSN="DWCTRLDB"; # This loads ODBC use Win32::ODBC; Data source name! ODBC Treiber von Windows # Connect to datasource # To secure we are connected if (!($db=new Win32::ODBC($DSN))) { print "Error connecting to $DSN\n"; print "Error: ". Win32::ODBC::Error(). "\n"; } else { print "Database opened...\n"; } Verbindung zur Datenbank herstellen # create an SQL Statement $SqlStatement = "create table TIDS (id INT, data VARCHAR(100))"; $SqlDropTable = "drop table TIDS"; if ($db->sql($sqldroptable)) { print "SQL failed.\n"; print "Error: ". $db->error(). "\n"; } else { print "Table droped\n" }
Java Database Connectivity JDBC 1.0 (Januar 1997) jdbc.sql.* als optionales Paket Basierend auf SQL92 JDBC 2.0 java.sql.* in JSE2 * (batch-updates, SQL3-Datentypen) javax.sql.* (optional ab Java 1.3 fest) enthält Data- Source (JNDI - Java Naming and Directory Interface), Connection-Pooling, verteilte Transaktionen JDBC 2.0 Treiber sind für die fast alle (bekannteren) RDBMS vorhanden * Java 2 Standard Edition (JSE2) auch Java2
Java Database Connectivity JDBC 3.0 Teil von Java 1.4 - neu unter anderem: Savepoints in Transaktionen, Wiederverwendung von PreparedStatements, JDBC-Datentypen BOOLEAN und DATALINK, Abrufen automatisch generierter Keys, Änderungen von LOBs (Large Objects) und mehrere gleichzeitig geöffnete ResultSets JDBC 4.0 (Dezember 2006) Teil von Java 1.6 neu hier: Annotationen für SQL-Queries, Treiber werden wenn vorbereitet automatisch angemeldet, XMLDatentypen aus SQL:2003, Zugriff auf die SQL ROWID APIS unter: http:// java.sun.com/products/jdbc/download.html
Java Database Connectivity JDBC eigens für Java entwickelt Folgt den Java Paradigmen Write once run anywhere Über JDBC-ODBC Bridge können auch ODBC Datenbanken (falls JDBC nicht vom DBMS unterstützt wird)
Bilder von: http://java.sun.com/products/jdbc/overview.html JDBC-Treiber-Typen Type 4 Type 3 Type 1 Type 2
Bilder von: http://java.sun.com/products/jdbc/overview.html JDBC-Treiber-Typen Ein JDBC-Typ-1-Treiber kommuniziert ausschließlich über einen JDBC-ODBC-Bridge-Treiber. Damit ist ein Typ-1-Treiber abhängig von einem installierten ODBC-Treiber. Der JDBC-ODBC- Bridge-Treiber wandelt JBDC- in ODBC-Anfragen um. Ein Typ-1-Treiber wird dann verwendet, wenn es zu der Datenbank keine eigenständigen JDBC-Treiber gibt. Type 1
Bilder von: http://java.sun.com/products/jdbc/overview.html JDBC-Treiber-Typen Ein Typ-2-Treiber kommuniziert über eine plattformspezifische Programmbibliothek mit dem Datenbankserver. Das bedeutet, dass für jede Betriebssystem- Plattform zu dem Typ-2-Treiber eine zusätzliche Programmbibliothek benötigt wird. Type 2
Bilder von: http://java.sun.com/products/jdbc/overview.html JDBC-Treiber-Typen Mittels des Typ-3-Treibers werden die JDBC-API-Befehle in DBMS-Befehle des Datenbankservers übersetzt und (über ein Netzwerkprotokoll) an einen Middleware-Treiber an den Datenbankserver übertragen. Ein Typ-3- Treiber benötigt damit keine plattformspezifischen Bibliotheken und muss auch nichts über den verwendeten Datenbankserver wissen. Typ-3-Treiber eignen sich sehr gut für Internet-Protokolle im Zusammenhang mit Firewalls. Type 3
Bilder von: http://java.sun.com/products/jdbc/overview.html JDBC-Treiber-Typen Diese Variante kommuniziert wie der Typ-3-Treiber. Allerdings wird die Kommunikation direkt mit dem Datenbankserver aufgenommen. Ein Middleware-Treiber wird dabei nicht verwendet. Damit kann ein Typ-4-Treiber schneller als ein Typ-3-Treiber sein, ist aber weniger flexibel. Typ-4-Treiber eignen sich gut für Intranet-Lösungen, die schnelle Netzprotokolle nutzen wollen. Type 4
Praxis JDBC Treiber für DBMS in Classpath aufnehmen, Beispiel: set JDBC_Driver="C:\MySQL\mysql-connector-java-3.1.6-bin.jar" java classpath %JDBC_Driver% MyAnwendung Treiber im Program laden und aktivieren, Beispiel: try { Class.forName(jdbcdriver); } catch (Exception e) {} Verbindung herstellen, Beispiel: try { Connection con = DriverManager.getConnection(dburl, username, passwd); } catch (Exception e) {}
Praxis SQL Statement (Objekt) erzeugen Statement stmt = con.createstatement(); SQL Anfrage erzeugen und an DBS schicken: ResultSet rs = stmt.executequery( select * from mytable ); Mit dem Ergebnis arbeiten: while (rs.next()) { String name = rs.getstring( Name ); System.out.println( Name = +name); }
Prepared Statements PreparedStatement stmt = null; stmt = con.preparestatement( select * from mytable where ID =? ); stmt.setint(1,4); ResultSet rs = stmt.executequery(); 1 erstes Fragezeichen wir mit Wert 4 gesetzt!
SQLJ Benötigt Präcompiler des DBMS-Herstellers! Überprüfungen durch Präcompiler Syntax und Semantik (DB-Objekte richtig geschrieben?) Schreibweise kompakter als JDBC Während der Laufzeit wird JDBC verwendet! Plattformunabhängig
Quelltext mit SQL-Befehlen Präcompiler SQL LIB STD LIB Quelltext in reiner host language Compiler DB Katalog Objektdatei Linker Ausführbares Programm
SQLJ - Beispiel #sql cur0 = {SELECT * FROM org}; while (true) { // retrieve and display the result from the SELECT statement #sql {FETCH :cur0 INTO :deptnumb, :deptname, :manager, :division, :location}; if (cur0.endfetch()) { break; } System.out.println(" " + Data.format(deptnumb, 8) + " " + Data.format(deptname, 14) + " " + Data.format(manager, 7) + " " + Data.format(division, 10) + " " + Data.format(location, 14)); } cur0.close(); // close the cursor
Performance Vergleich http://www-128.ibm.com/developerworks/db2/library/techarticle/0204pooloth/0204pooloth.html
Performance Vergleich http://www-128.ibm.com/developerworks/db2/library/techarticle/0204pooloth/0204pooloth.html
Vorteile - Nachteile ESQL statisch ESQL dynamisch SQLJ CLI (ODBC und JDBC) Was gibt es noch?
Stored Procedures SQL Statements werden auf der Serverseite gehalten Verbunden mit PL Schleifen etc. vorhanden Wann insb. ist dies von Vorteil?
SQL-Injection SQL-Injection Einschleusen von zusätzlichem Code oder SQL-Befehlen Siehe Wikipedia für weitere Infos, Bsp. und Gegenmaßnahmen: http://de.wikipedia.org/wiki/sql_injection Generell ist eine Webanwendung für die korrekte Prüfung der Eingabedaten verantwortlich. Geeignete Schutzmaßnahmen sind in erster Linie dort zu implementieren.