2010-06-23 17 views
16

Czy ktoś próbował utworzyć procedury przechowywane przy użyciu bazy danych H2?Jak utworzyć procedurę składowaną za pomocą bazy danych H2?

+0

Mój problem z używaniem funkcji Java różni się od [tej] (http://stackoverflow.com/questions/3098905/how-to-create-stored-procedure-using-h2-database). Nie wiem, jak uzyskać dostęp do tabel w takiej funkcji (tworzenie połączenia nie ma sensu, robi to)? – maaartinus

+0

Zawsze pomaga przejrzeć podręcznik: [H2: Funkcje zdefiniowane przez użytkownika i przechowywane procedury] (http://www.h2database.com/html/features.html#user_defined_functions) – NullUserException

Odpowiedz

9

Aby uzyskać dostęp do bazy danych w ramach funkcji Java, potrzebne jest połączenie. W przypadku H2 istnieją dwa sposoby uzyskania takiego połączenia:

Rozwiązanie 1: Jeśli pierwszym parametrem funkcji Java jest java.sql.Connection, baza danych zapewnia połączenie. W przypadku SQL jest to parametr "ukryty", co oznacza, że ​​nie można i nie trzeba go ustawiać jawnie. Jest to udokumentowane: User-Defined Functions and Stored Procedures, "Funkcje wymagające połączenia". Przykład:

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

Rozwiązanie 2: Dla zgodności z Apache Derby i Oracle, można otworzyć nowe połączenie wewnątrz funkcji Java z wykorzystaniem DriverManager.getConnection("jdbc:default:connection"). Ta funkcja jest dostępna w wersji H2 1.3.151 i nowszej i jest domyślnie wyłączona. Aby go włączyć, dołącz ;DEFAULT_CONNECTION=TRUEto the database URL. Jest to problematyczna, ponieważ sterownik Oracle JDBC spróbuje rozwiązać ten adres URL bazy danych, jeśli zostanie załadowany przed sterownikiem H2. Zasadniczo nie można używać tej funkcji, jeśli załadowany jest sterownik Oracle (uważam to za błąd w sterowniku Oracle).

+0

zawsze zamykaj wyciągi, gdy skończysz z nimi ... Instrukcja s = conn.createStatement(); try {return s.executeQuery (sql);} finally {s.close();} – jcalfee314

+0

Dla H2 (i to jest około H2) nie ma znaczenia, czy zamkniesz oświadczenie lub nie. Ale tak, generalnie oświadczenie powinno zostać zamknięte. –

+0

@Thomas Mueller Twoje przykłady dokumentacji są tak słabe czy wstawisz przykłady CRUD – Dunken

Powiązane problemy