Institut für Informationssysteme Dr. C. Türker Eidgenössische Technische Hochschule Zürich Swiss Federal Institute of Technology Zurich Beispiellösungen auf den nächsten Seiten! Objektrelationale, erweiterbare Datenbanken WS 04/05 Übung 9 Beispiellösung Aufgabe 1: Objektrelationale DB-Anwendungsprogrammierung Schreiben Sie Java-Programme, die mittels JDBC auf eine Oracle-Datenbank zugreifen und Folgendes berechnen bzw. ausgeben: • Geben Sie den Namen, den Wohnort und die erste Telefonnumer des Kunden aus, der am meisten Bestellungen hat. • Iterieren Sie über alle Kunden und geben sie den Namen des Kunden mit den Daten ihrer ältesten Bestellung aus. Bei Kunden, die in Zürich wohnen, geben sie zusätzlich die PLZ und die Strasse aus. • Geben Sie alle Daten über den Kunden mit der Kundennummer 1740 aus, das heißt auch die Daten über seine Bestellungen, Positionen in Bestellungen sowie bestellten Artikel. /////////////////////////////////////////////////////////////////// // // JDBC-Programm, das den Name, den Wohnort und die erste // Telefonnummer des Kunden ausgibt, der am Bestellungen hat. // // Aufruf: java Uebung10_1 DB-Name Nutzername Passwort // // PS: JDBC-Programm wurde nicht vollständig ausprogrammiert! // Es fehlen noch einige IF-Abfragen, um alle möglichen Fehler // durch Nullwertbelegungen in der Datenbank abzufangen. // // PPS: Falls mehrere Kunden zugleich die meisten Bestellungen // haben, wird nur der erste aus dem Resultset ausgegeben. // /////////////////////////////////////////////////////////////////// import java.sql.*; import java.util.*; import oracle.sql.*; class Uebung10_1 { public static void main (String argv []) throws SQLException { try { // Lade passenden JDBC-Treiber Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException exc) { System.out.println(exc.getMessage()); System.exit(1); } try { // Stelle DB-Verbindung her String url = "jdbc:oracle:oci8:@" + argv[0]; String user = argv[1]; String pw = argv[2]; Connection con = DriverManager.getConnection(url, user, pw); // Erzeuge und führe SQL-Anweisung aus Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT Name, Anschrift, Telefone " + 1 2 "FROM "WHERE " " " " " Kunde k1 " + (SELECT COUNT(*) " + FROM TABLE(k1.Bestellungen)) = " + (SELECT MAX(c) FROM " + (SELECT COUNT(*) AS c " + FROM Kunde k2, TABLE(k2.Bestellungen) b " + GROUP BY k2.Kundennummer))"); // Iteriere durch die Ergebnismenge rs.next(); System.out.println("-------------------------------"); System.out.println("-- Hier sind ist der Kunde "); System.out.println("-- mit den meisten Bestellungen"); System.out.println("-------------------------------"); // Gib den Namen aus System.out.println("Kundenname: /////////////////////////////////////////////////////////////////// // // JDBC-Programm, das über alle Kunden iteriert und die Daten ihrer // ältesten, das heisst ersten, Bestellung ausgibtt. Bei Zürcher // Kunden werden zusätzlich die PLZ und die Strasse ausgegeben. // // Aufruf: java Uebung10_2 DB-Name Nutzername Passwort // // PS: In Oracle ist die Standard-Schnittstelle Ref noch nicht // richtig implementiert. Daher wurde hier die Oracle-spezifische // Variante REF verwendet! // // PPS: JDBC-Programm ist nicht vollständig ausprogrammiert! // Es fehlen noch einige IF-Abfragen, um alle möglichen Fehler // durch Nullwertbelegungen in der Datenbank abzufangen) // /////////////////////////////////////////////////////////////////// " + rs.getString(1)); // Gib nur den Ort der Anschrift aus // Hole das Anschrift-Objekt Struct adresse = (Struct) rs.getObject(2); // Extrahiere die Objektattribute Object attrs [] = (Object[]) adresse.getAttributes(); System.out.println("Wohnort: " + attrs[3]); // Gib nur die 1. Telefonnummer aus // Hole das Array-Objekt Array telarray = (Array) rs.getArray(3); // Extrahiere die Array-Felder Object t [] = (Object[]) telarray.getArray(); System.out.println("Telefon: " + t[0]); // Schliesse Ergebnismenge, Anweisung und Verbindung rs.close(); stmt.close(); con.close(); } catch (SQLException exc) { // Fehlerbehandlung System.out.println("SQL-Exception: " + exc); } } } import import import import import java.sql.*; java.util.*; oracle.sql.*; java.io.*; oracle.jdbc.driver.*; class Uebung10_2 { public static void main (String argv []) throws SQLException { try { // Lade passenden JDBC-Treiber Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException exc) { System.out.println(exc.getMessage()); System.exit(1); } try { // Stelle DB-Verbindung her String url = "jdbc:oracle:oci8:@" + argv[0]; String user = argv[1]; String pw = argv[2]; Connection con = DriverManager.getConnection(url, user, pw); // Erzeuge und führe SQL-Anweisung aus Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery( 3 4 "SELECT "FROM "WHERE " " Name, Anschrift, DEREF(VALUE(b)) " + Kunde k, TABLE(Bestellungen) b " + VALUE(b).Eingangsdatum <= ALL " + (SELECT VALUE(b2).Eingangsdatum " + FROM TABLE(Bestellungen) b2)"); REF artikelref = (REF) posattrs[0]; if (artikelref != null) { // Hole Wert des referenzierten Bestellungsobjekts STRUCT artikel = (STRUCT) artikelref.getValue(); // Materialisiere die Objektattribute Object artattrs [] = (Object[]) artikel.getAttributes(); System.out.println("Artikelnummer: " + artattrs[0]); System.out.println("Bezeichnung: " + artattrs[1]); System.out.println("Preis: " + artattrs[2]); System.out.println("Beschreibung: " + artattrs[3]); } System.out.println("--------------------------"); System.out.println("-- Hier sind alle Kunden "); System.out.println("-- mit ihrer 1. Bestellung"); System.out.println("--------------------------"); // Iteriere durch die Ergebnismenge while(rs.next()) { // Gib den Namen aus System.out.println("Kundenname: } } // Schliesse Ergebnismenge, Anweisung und Verbindung rs.close(); stmt.close(); con.close(); " + rs.getString(1)); // Hole das Anschrift-Objekt Struct adresse = (Struct) rs.getObject(2); // Materialisiere die Objektattribute Object attrs [] = (Object[]) adresse.getAttributes(); if (((String) attrs[3]).toUpperCase().compareTo("ZURICH") == 0) { System.out.println("wohnt in Zürich"); System.out.println("PLZ: " + attrs[2]); System.out.println("Strasse: " + attrs[0]); } } catch (SQLException exc) { // Fehlerbehandlung System.out.println("SQL-Exception: " + exc); } } } // Hole das Bestellung-Objekt Struct bestellung = (Struct) rs.getObject(3); // Materialisiere die Objektattribute Object bestattrs [] = (Object[]) bestellung.getAttributes(); System.out.println("Bestellnummer: " + bestattrs[0]); System.out.println("Eingangsdatum: " + bestattrs[1]); System.out.println("Status: " + bestattrs[2]); // Hole die Positionen Array posarray = (Array) bestattrs[3]; // Materialisiere die Array-Felder Object p [] = (Object[]) posarray.getArray(); for (int i=0; i < p.length; i++) { System.out.println(" "); System.out.println((i+1) + ". Position"); Struct position = (Struct) p[i]; Object posattrs [] = (Object[]) position.getAttributes(); System.out.println("Anzahl: " + posattrs[1]); // Hole Referenz auf das Bestellungsobjekt 5 6 /////////////////////////////////////////////////////////////////// // // JDBC-Programm, das alle Daten eines Kunden ausgibt // // Aufruf: java Uebung10_3 DB-Name Nutzername Passwort Kundennummer // // PS: In Oracle ist die Standard-Schnittstelle Ref noch nicht // richtig implementiert. daher wurde hier die Oracle-spezifische // Variante REF verwendet! // // PPS: JDBC-Programm st nicht vollständig ausprogrammiert! // Es fehlen noch einige IF-Abfragen, um alle möglichen Fehler // durch Nullwertbelegungen in der Datenbank abzufangen. // /////////////////////////////////////////////////////////////////// import import import import import java.sql.*; java.util.*; oracle.sql.*; java.io.*; oracle.jdbc.driver.*; class Uebung10_3 { public static void main (String argv []) throws SQLException { try { // Lade passenden JDBC-Treiber Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException exc) { System.out.println(exc.getMessage()); System.exit(1); } try { // Stelle DB-Verbindung her String url = "jdbc:oracle:oci8:@" + argv[0]; String user = argv[1]; String pw = argv[2]; Connection con = DriverManager.getConnection(url, user, pw); // Erzeuge und führe SQL-Anweisung aus String str = "SELECT * FROM Kunde WHERE Kundennummer = ?"; PreparedStatement stmt = con.prepareStatement(str); stmt.setInt(1, Integer.parseInt(argv[3])); ResultSet rs = stmt.executeQuery(); 7 rs.next(); System.out.println("-----------------------------------"); System.out.println("-- Hier sind alle Daten des Kunden " + Integer.parseInt(argv[3])); System.out.println("-----------------------------------"); // Gib den Namen aus System.out.println("Kundenname: " + rs.getString(1)); // Hole das Anschrift-Objekt Struct adresse = (Struct) rs.getObject(2); if (adresse != null) { // Materialisiere die Objektattribute Object attrs [] = (Object[]) adresse.getAttributes(); // Gib vollständige Anschrift aus System.out.println("Anschrift: " + attrs[0] + ", " + attrs[1] + ", " + attrs[2] + ", " + attrs[3] + ", " + attrs[4]); } // Hole die innere Tabelle Telefone Array telarray = (Array) rs.getArray(3); if (telarray != null) { // Materialisiere die Array-Felder Object t [] = (Object[]) telarray.getArray(); // Gib alle Telefonnummern aus for (int i=0; i < t.length; i++) System.out.println((i+1) + ". Telefonnummer: " + t[i]); } // Gib die Email-Adresse aus System.out.println("Email: " + rs.getString(4)); // Gib die Kundennummer aus System.out.println("Kundennummer: " + rs.getInt(5)); // Hole die Bestellungen Array bestellungen = (Array) rs.getArray(6); if (bestellungen != null) { // Materialisiere die Bestellungen Object b [] = (Object[]) bestellungen.getArray(); // Iteriere über alle Bestellungen 8 for (int j=0; j < b.length; j++) { System.out.println("-----------------------------------"); System.out.println((j+1) + ". Bestellung"); // Hole Referenz eines Bestellungsobjekts REF bestellungref = (REF) b[j]; System.out.println("Bestellungref: " + bestellungref); // Hole Wert des referenzierten Bestellungsobjekts Struct bestellung = (Struct) bestellungref.getValue(); System.out.println("Bestellungvalue: " + bestellung); // Materialisiere die Objektattribute Object bestattrs [] = (Object[]) bestellung.getAttributes(); System.out.println("Bestellnummer: System.out.println("Eingangsdatum: System.out.println("Status: stmt.close(); con.close(); } catch (SQLException exc) { // Fehlerbehandlung System.out.println("SQL-Exception: " + exc); } } } " + bestattrs[0]); " + bestattrs[1]); " + bestattrs[2]); // Hole die Positionen Array posarray = (Array) bestattrs[3]; // Materialisiere die Positionen Object p [] = (Object[]) posarray.getArray(); for (int i=0; i < p.length; i++) { System.out.println(" "); System.out.println((i+1) + ". Position"); System.out.println("Positionvalue: " + p[i]); Struct position = (Struct) p[i]; Object posattrs [] = (Object[]) position.getAttributes(); System.out.println("Anzahl: " + posattrs[1]); // Hole Referenz auf das Bestellungsobjekt REF artikelref = (REF) posattrs[0]; System.out.println("Artikelref: " + artikelref); if (artikelref != null) { // Hole Wert des referenzierten Bestellungsobjekts STRUCT artikel = (STRUCT) artikelref.getValue(); // Materialisiere die Objektattribute Object artattrs [] = (Object[]) artikel.getAttributes(); System.out.println("Artikelnummer: " + artattrs[0]); System.out.println("Bezeichnung: " + artattrs[1]); System.out.println("Preis: " + artattrs[2]); System.out.println("Beschreibung: " + artattrs[3]); } } } } // Schliesse Ergebnismenge, Anweisung und Verbindung rs.close(); 9 10