6. Übung - Datenbankprogrammierung Java Database Connectivity (JDBC) und Open Database Connectivity (ODBC) Ziel der Übung. Kommunikation von C- und Java-Anwendungen mit DB2. Aufgaben Teil 1: JDBC Verwenden Sie zum Verbindungsaufbau zur jeweiligen Datenbank den DB2 Universal JDBC- Treiber vom Typ 4 mit Eingabe von Nutzername und Passwort! Beachten Sie aber, dass Sie bei der Einreichung Ihrer Lösung diese Daten wieder löschen. Für die Verwendung der JDBC- Treiber müssen die speziellen Bibliotheken dem Projekt hinzugefügt werden. Diese befinden sich im Verzeichnis /opt/ibm/db2/v9.7/java. 1. Aufgabe: Datenbankanfragen mit JDBC (4 Punkte) Die folgenden Teilaufgaben arbeiten auf der GEODB-Datenbank. Falls die GEODB-Datenbank nicht vorhanden ist, dann führen Sie bitte die Skripte create.sql und import.sql im Verzeichnis /home/dbprog/data/geodb/ aus. Schreiben Sie eine Datenbankanwendung, welche Informationen zu einem vom Nutzer angegebenen Ort liefert! Die Anwendung soll dazu den Namen der Stadt oder Gemeinde von der Standardeingabe lesen und bei leerer Eingabe beenden. Hinweis: Nutzereingaben können unter Java wie folgt verarbeitet werden: public void <name>(<a r g s >) throws IOException { BufferedReader in = new BufferedReader (new InputStreamReader ( System. in ) ) ; S t r i n g s = in. readline ( ) ; while ( s!= null && s. l ength ( ) > 0) { //... s = in. readline ( ) ; Die folgenden Teilaufgaben erweitern iterativ die Leistungsfähigkeit Ihres Programms. 1. Ermitteln Sie alle Landkreise, in denen der übergebene Ort vorkommt, und listen Sie diese alphabetisch sortiert auf! Lösen Sie diese Aufgabe (a) mittels normalen Datenbankabfragen! (0.5) (b) mittels vorkompilierten, parametrisierten Datenbankabfragen! (0.5) 2. Ermitteln Sie für jeden Landkreis der Stadt alle anderen Städte in diesem Landkreis! Handelt es sich um eine kreisfreie Stadt (siehe Beispiel unten), so geben Sie stattdessen alle Ortsteile der übergebenen Stadt an! (2) 1
Beispiel: Die Ausgabe für die Stadt Weimar könnte wie folgt aussehen: Stadt? Weimar 1. Weimar im Landkreis "Kreisfreie Stadt Weimar" - Ortsteile: <unbekannt> 2. Weimar im Landkreis "Landkreis Marburg-Biedenkopf" - Andere Staedte: Amöneburg; Angelburg; Bad Endbach; Biedenkopf; [...] 3. Was ist der Unterschied zwischen Typ 2 und Type 4 JDBC-Treibern und warum ist es bei Typ 2 nicht notwendig einen Benutzer und Passwort anzugeben? (1) 2. Aufgabe: Verarbeiten von Meta-Informationen (3 Punkte) 1. Ermittlen Sie einige Metainformationen zur TPCH-Datenbank (1)! Verwenden Sie dazu die vier Funktionen DatabaseMetaData.getDatabase*() und DatabaseMetaData.getDriver*()! Hinweis: Die JavaDoc-Dokumentation der DatabaseMetaData-Klasse beschreibt alle relevanten Funktionen. 2. Geben Sie die Namen aller in Ihrem Schema (DB2INS??) definierten Tabellen aus! Greifen Sie dazu nicht auf den Systemkatalog zu, sondern verwenden Sie die durch JDBC bereitgestellten Metadaten! (1) 3. Schreiben Sie eine Methode print(resultset rs, int k), welche sowohl die Attributnamen als auch die ersten k Zeilen des übergebenen ResultSets auf dem Bildschirm ausgibt! Nach Abarbeitung der Methode soll das ResultSet geschlossen werden. (1) Tipp: Auch ResultSets haben Metadaten. Beispiel: Die Ausgabe der ersten drei Zeilen für die Anfrage SELECT R REGIONKEY, TRIM(R NAME) FROM REGION könnte wie folgt aussehen: Attribute: (R_REGIONKEY, R_NAME) (0, AFRICA ) (1, AMERICA ) (2, ASIA ) Teil 2: ODBC Verwenden Sie zum Verbindungsaufbau zur Datenbank die ODBC-Funktion SQLConnect mit Eingabe von Nutzername und Passwort! Achten Sie vor Abgabe der Übung darauf, das Passwort wieder zu entfernen! Achtung, die Übung ist so vorzubereiten, dass sie auf dem db4702-server kompilier- und ausführbar ist! 3. Aufgabe: Ausführen der Beispielanwendung Kopieren Sie die Beispielanwendung von /home/dbprog/examples/odbc/mycliapp.c in Ihr Verzeichnis. Ändern Sie entsprechend den Nutzernamen und das Passwort, kompilieren Sie die Anwendung und führen Sie diese aus. 2
Hinweis: Verwenden Sie dazu das Script /home/dbprog/build/build-app.sh. 4. Aufgabe: Arbeiten mit Meta-Informationen (1 Punkt) Ermitteln Sie folgende Metainformationen über die TPCH-Datenbank: 1. Name und Version des Datenbankmanagers (SQL DBMS NAME und SQL DBMS VER) 2. Name und ODBC-Version des Treibers (SQL DRIVER NAME und SQL DRIVER ODBC VER) 3. Name der Datenbank (SQL DATABASE NAME) Hinweis: Verwenden Sie dazu die Funktion SQLGetInfo()! 5. Aufgabe: Datenbankabfragen mit ODBC (2 Punkte) Die folgenden Aufgaben arbeiten auf der TPCH-Datenbank. Schreiben Sie eine Datenbankanwendung, welche Informationen zu einem vom Nutzer angegebenen Land liefert. Die Anwendung soll dazu den Namen des Landes von der Standardeingabe lesen. Hinweis: Nutzereingaben können unter C wie folgt verarbeitet werden: int main ( int argc, char argv [ ] ) { char input [ 5 0 ] ; p r i n t f ( Landkreis : ) ; f g e t s ( input, 50, s t d i n ) ; input [ s t r l e n ( input ) 1] = \0 ; //... 1. Ermitteln Sie alle Kunden, die im übergebenen Land (NATION) vorkommen und listen Sie diese auf! Lösen Sie diese Aufgabe (a) mittels normalen Datenbankabfragen! (0.5) (b) mittels vorkompilierten, parametrisierten Datenbankabfragen! (0.5) 2. Ermitteln Sie zusätzlich den Namen aller Teile, die von einem Lieferanten aus der übergebenen Nation stammen. (1) 6. Aufgabe: Verarbeiten von Stored Procedures mit ODBC (1.5 Punkte) Schreiben Sie eine Datenbankanwendung, welche die Personalkosten zu einer vom Nutzer angegebenen Projektnummer liefert! Die Anwendung soll sich dazu mit der SAMPLE-Datenbank verbinden und die Nummer des Projekts von der Standardeingabe lesen. Hinweis: Nutzen Sie die Stored Procedure PROJBUDGET (IN PROJNO, OUT BUDGET)! Laden Sie von der Kommandozeile aus das Script /home/dbprog/examples/odbc/projbudget.sql, um die Stored Procedure anzulegen. Beispiel: Die Ausgabe für die Projektnummer AD3111 könnte wie folgt aussehen: Projektnummer? AD3111 Personalkosten: 81538 3
Teil 3: Zertifizierungsvorbereitung (3.5 Punkte) Die hier gestellten Aufgaben sollen Sie auf die IBM-DB2-Zertifizierung vorbereiten. 1. Which of the following JDBC objects can be used to get information about the data types that have been assigned to each column returned when the following query is executed? SELECT * FROM DEPARTMENTS ResultSet DatabaseMetaData ResultSetMetaData 2. Which of the following JDBC interfaces contains methods that are called to determine whether or not cursors persist across COMMIT boundaries? ResultSet DatabaseMetaData ResultSetMetaData 3. Which of the following JDBC objects can be used to execute SQL statements that contain parameter markers? CallableStatement PreparedStmt CallableStmt 4. Which of the following JDBC object methods can be used to obtain DB2-specific error values if the execution of an update operation fails?.geterrorcode() PreparedStatement.getSQLCA() ResultSet.getError() SQLException.getErrorCode() 5. Which of the following CLI/ODBC statement handle attributes is used to control the number of rows that are retrieved from a result data set each time the SQLFetch() function is called? SQL ATTR MAX ROWS SQL ATTR ROW ARRAY SIZE SQL ATTR ROWSET SIZE 4
SQL ATTR FETCH SIZE 6. Which of the following CLI/ODBC functions can cause a cursor to be opened? SQLFetch() SQLPrep() SQLExecDirect() SQLOpen() 7. Which two of the following options will cause a dialog to be displayed when more information is needed by the SQLDriverConnect() function than was provided in the connection string used? SQL DRIVER NOPROMPT SQL DRIVER COMPLETE SQL DRIVER QUERY USER SQL DRIVER COMPLETE REQUIRED SQL DRIVER PROMPT USER Abgabe Bitte senden Sie alle Lösungen in Form einer SQL-Datei und einer SQLJ-Datei bis zum Dienstag, den 16.06.2015, an Martin Kettel (martin.kettel@mailbox.tu-dresden.de). Für Lösungen von Textaufgaben bitte Kommentare innerhalb des SQL-Skripts einfügen. Das Lesen der Tutorials ist eine wesentliche Voraussetzung zur erfolgreichen Absolvierung der Zertifizierung! Wir empfehlen daher, schrittweise während des Semesters diese entsprechend der aktuellen Vorlesungsthemen durchzugehen. 5