Objektrelationale, erweiterbare Datenbanken WS 04/05 Übung 9

Werbung
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
Herunterladen