Create Database mit Java

Hallo PostgreSQL-Freunde,

ich soll ein Referat über Java und Datenbanken halten. Meine Entwicklungsumgebung ist Eclipse. Ich habe auch alles soweit hinbekommen.
Ich habe mich mit einer bereits existierenden Datenbank verbunden und wollte anschließend eine Datenbank erzeugen.

Die Datenbank wird auch erzeugt, aber nach dem erstellen schmeißt er eine Exception.

    public void datenbankErstellen() {
        Statement statement;
        ResultSet resultSet;
        try {
            statement = verbindung.createStatement();
            resultSet = statement.executeQuery("CREATE DATABASE hochschule WITH OWNER = postgres ENCODING = 'WIN1252';");
            statement.close();
            resultSet.close();
        } catch (SQLException e) {
            // TODO Automatisch erstellter Catch-Block
            e.printStackTrace();
        }

    }

Fehlermeldung: org.postgresql.util.PSQLException: Die Abfrage lieferte kein Ergebnis.

Was muss ich dort ändern, damit diese Exception nicht mehr auftaucht?

Was passiert, wenn du das Semikolon aus der Anfrage herausnimmst?

Das bringt leider garnix. Außerdem muss das da ja hin, um den Befehl abzuschließen.

Nicht wirklich. Das Semikolon wird in interaktiven Verbindungen benötigt, um das Ende des Befehls anzuzeigen. Bei nicht-interaktiven Verbindungen wie aus einer Programmiersprache heraus ist es grübeleigentlich unnötig.

Zusätzlich startet das Semikolon einen weiteren Befehl - und da dieser leer ist …

Hmm ok gut zu wissen. Ich habe es jetzt aber hin bekommen.

public void datenbankErstellen() {
        Statement statement;

        try {
            statement = verbindung.createStatement();
            String sqlText = "DROP DATABASE hochschule; " +
                             "CREATE DATABASE hochschule " +
                             "WITH OWNER = postgres " +
                             "ENCODING = 'WIN1252';";
            System.out.println("Befehl ausgeführt: "+sqlText+"\n");
            statement.executeUpdate(sqlText);
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace ();
        }
        verbindungSchließen();
        database = "hochschule";
        verbindungOeffnen();
    }

Zwei Anmerkungen:

  • Führe die Abfragen einzeln aus, dann kannst du auch entsprechend reagieren, wenn es einen Fehler gibt.
  • Es gibt: DROP IF EXISTS.

Mal rein aus Interesse: warum tut man sich WIN1252 als Encoding an?

Andreas

Ich bin eher ein Java-Freund … aber:

CREATE DATABASE liefert nunmal kein Ergebnis - in SQL/JDBC-Deutsch → keine Referenz auf ResultSet daher ist es auch nicht erlaubt (und auch nicht sinnvoll) resultSet = statement.executeQuery(“…”) zu verwenden, da executeQuery(…) so spezifizert ist, dass es IMMER ein ResultSet zu liefern hat, oder im Fehlerfall mit einer SQLException verlassen wird.

Auch wenn dein 2. Beispiel funktioniert, ist es dennoch nicht besonders sinnvoll executeUpdate() zu verwenden. Du koenntest ja mal die Handvoll Methoden anschauen die die java.sql.Statement bietet - sind nicht viel. Wenn du diese deine “Erkenntnis” auf andere DBMS anwendest, dann koenntest du auf die Nase fallen. Es gibt ja auch noch andere schöne DBMS wie MySQL und MSSQL …

Returns: a ResultSet object that contains the data produced by the given query; never null
Throws: SQLException if a database access error occurs, this method is called on a
closed Statement or the given SQL statement produces anything other
than a single ResultSet object

Wahrscheinlich kennst du Eclipse auch noch nicht lange ? Da gibt es ein View das nennt sich JavaDoc … womit du dir die Quellcode-Documentation ansehen kannst.

Die Klasse (das Interface) java.sql.Statement bietet noch einige andere Methoden um Statements abzusetzen. Z.B kannst du java.sql.Statement.execute(“…”) verwenden dessen Rückgabewert (boolean) du in diesem Fall (CREATE DATABASE) auch ignorieren darfst.

Das ENCODING ist in dem Beispiel eigentlich völlig egal. Es handelt sich hierbei ja nur um ein Beispiel. Habe die Ehrenvolle Aufgabe bekommen, einen Vortrag über Java und Datenbanken zu halten. Ich habe meine Beispiele nochmals überarbeitet. Ich denke, ich habe jetzt dank eurer Hilfe ganz gut begriffen, wie ich so etwas vernünftig umsetze. Ich habe die Beispiele ja mit Absicht so einfach gehalten, da die Zuhörer des Vortrages Teilweise noch nie was mit SQL zu tun hatten. Das kommt erst im 3. Semester.
Es soll ja auch nur einen kleinen Einblick geben, wie SQL funktioniert und wie man mit Java auf eine PostgreSQL DB zugreifen könnte.

Ich beschäftige mich seid ~ 1/2 Jahr mit Eclipse und Java.

EDIT: Ich habe vor 2 Jahren mit PostgreSQL und C++ (Borland Builder) gearbeitet. Da konnte man sich das aber alles zusammen klicken.

Also diese Routine tuts für mich für gewöhnlich,ist ein Teil aus einem Programm
von mir das auch User, Tablespaces, Rechte, Tabellen u.s.w anlegt,vielleicht hilft es
Dir weiter.
****// Legt Postgres DB an und liefert bei Erfolg true zurück.public static boolean createdb(String db_name) throws Exception {

boolean iState = true;

Connection con = ConnectionManager.getConnection();
try {
Statement statement = con.createStatement();
String query =
CREATE DATABASE “+db_name+” ENCODING ‘UTF8’ OWNER”+
"dbadmin TABLESPACE pg_global;";

// Wenns nicht klappt raise Exception
if (statement.execute(query)) { }

} finally {
con.close();
}
}
catch (Exception e) {
iState = false; // False wenns nicht ging
}
return iState;
}

Hmm, also wenn Du das nicht für Dich selber brauchst ist das eigentlich
keine gute Idee solche “properitären” Sachen an SQL-Frischlinge weiterzugeben.

Die Datenbanken verhalten sich da ganz unterschiedlich und vielleicht
gehen die dann von der Denke aus, dass alles so wie bei Postgres
läuft.

Bei Oracle dauert z.B das anlegen einer neuen DB locker schon
mal 20 bis 30 Min (die der Create Database Prozess braucht) und
dann legt das Teil eine 400 MBytes “leere” Startdatenbank mit
nichts drin an (sowas solltest Du denen sagen).