2010-06-23 13 views
16

Qualcuno ha provato a creare stored procedure utilizzando il database H2?Come creare stored procedure usando il database H2?

+0

Il mio problema con l'utilizzo delle funzioni Java è diverso da [questo] (http://stackoverflow.com/questions/3098905/how-to-create-stored-procedure-using-h2-database). Non so come accedere alle tabelle in tale funzione (la creazione di una connessione non ha senso lì, lo fa)? – maaartinus

+0

Aiuta sempre a consultare il manuale: [H2: Funzioni definite dall'utente e stored procedure] (http://www.h2database.com/html/features.html#user_defined_functions) – NullUserException

risposta

9

Per accedere al database all'interno di una funzione Java, è necessaria una connessione. Per H2, ci sono due modi per ottenere una tale connessione:

Soluzione 1: Se il primo parametro della funzione Java è un java.sql.Connection, quindi il database fornisce la connessione. Per SQL, questo è un parametro 'nascosto', il che significa che non puoi e non devi impostarlo esplicitamente. Questo è documentato: User-Defined Functions and Stored Procedures, "Funzioni che richiedono una connessione". Esempio:

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

Soluzione 2: Per la compatibilità con Apache Derby e Oracle, è possibile aprire una nuova connessione all'interno della funzione Java utilizzando DriverManager.getConnection("jdbc:default:connection"). Questa funzione è disponibile in H2 versione 1.3.151 e successive e viene disabilitata per impostazione predefinita. Per abilitarlo, aggiungi ;DEFAULT_CONNECTION=TRUEto the database URL. È una funzionalità problematica poiché il driver JDBC Oracle tenterà di risolvere questo URL del database se è stato caricato prima del driver H2. Quindi in pratica non è possibile utilizzare la funzione se il driver Oracle è caricato (lo considero un bug nel driver Oracle).

+0

chiudi sempre le tue dichiarazioni quando hai finito con loro ... Statement s = conn.createStatement(); try {return s.executeQuery (sql);} finally {s.close();} – jcalfee314

+0

Per H2 (e questo è su H2) non importa se chiudi la dichiarazione o no. Ma sì, generalmente la dichiarazione dovrebbe essere chiusa. –

+0

@Thomas Mueller i tuoi esempi di documentazione sono così poveri potresti mettere un esempio CRUD – Dunken

Problemi correlati