2010-06-23 5 views
16

Hat jemand versucht, gespeicherte Prozeduren mithilfe der H2-Datenbank zu erstellen?Wie erstellt man gespeicherte Prozedur mit H2-Datenbank?

+0

Mein Problem mit Java-Funktionen unterscheidet sich von diesem [http://stackoverflow.com/questions/3098905/how-to-create-stored-procedure-using-h2-database]. Ich weiß nicht, wie man in einer solchen Funktion auf Tabellen zugreift (das Erstellen einer Verbindung macht dort keinen Sinn, oder?) – maaartinus

+0

Es hilft immer, das Handbuch zu betrachten: [H2: Benutzerdefinierte Funktionen und gespeicherte Prozeduren] (http://www.h2database.com/html/features.html#user_defined_functions) – NullUserException

Antwort

9

Um auf die Datenbank innerhalb einer Java-Funktion zuzugreifen, benötigen Sie eine Verbindung. Für H2, gibt es zwei Möglichkeiten, eine solche Verbindung zu erhalten:

Lösung 1: Wenn der erste Parameter der Java-Funktion ein java.sql.Connection ist, dann ist die Datenbank, die die Verbindung bereitstellt. Für SQL ist dies ein "versteckter" Parameter, was bedeutet, dass Sie ihn nicht explizit festlegen müssen und müssen. Dies ist dokumentiert: User-Defined Functions and Stored Procedures, "Funktionen, die eine Verbindung erfordern". Beispiel:

CREATE ALIAS QUERY AS $$ 
ResultSet query(Connection conn, String sql) throws SQLException { 
    return conn.createStatement().executeQuery(sql); 
} $$; 
CALL QUERY('SELECT * FROM DUAL'); 

Lösung 2: Für die Kompatibilität mit Apache Derby und Oracle, Sie eine neue Verbindung innerhalb der Java-Funktion DriverManager.getConnection("jdbc:default:connection") öffnen können. Diese Funktion ist in H2 Version 1.3.151 und neuer verfügbar und standardmäßig deaktiviert. Um es zu aktivieren, fügen Sie ;DEFAULT_CONNECTION=TRUEto the database URL an. Dies ist ein problematisches Feature, da der Oracle JDBC-Treiber versucht, diese Datenbank-URL aufzulösen, wenn sie vor dem H2-Treiber geladen wird. Im Grunde können Sie die Funktion nicht verwenden, wenn der Oracle-Treiber geladen ist (ich betrachte dies als einen Fehler im Oracle-Treiber).

+0

Schließen Sie immer Ihre Aussagen, wenn Sie damit fertig sind ... Statement s = conn.createStatement(); try {return s.executeQuery (sql);} finally {s.close();} – jcalfee314

+0

Für H2 (und das ist ungefähr H2) ist es egal, ob Sie schließen die Aussage oder nicht. Aber ja, generell sollte die Aussage geschlossen sein. –

+0

@Thomas Mueller Ihre Dokumentationsbeispiele sind so schlecht würden Sie eine CRUD Beispiele setzen – Dunken

Verwandte Themen