2010-06-23 34 views
16

¿Alguien ha intentado crear procedimientos almacenados usando la base de datos H2?¿Cómo crear un procedimiento almacenado usando la base de datos H2?

+0

Mi problema con el uso de funciones de Java es diferente de [este] (http://stackoverflow.com/questions/3098905/how-to-create-stored-procedure-using-h2-database). No sé cómo acceder a las tablas en esa función (crear una conexión no tiene sentido allí, ¿verdad?) – maaartinus

+0

Siempre es útil mirar el manual: [H2: Funciones definidas por el usuario y procedimientos almacenados] (http://www.h2database.com/html/features.html#user_defined_functions) – NullUserException

Respuesta

9

Para acceder a la base de datos dentro de una función Java, necesita una conexión. Para H2, hay dos maneras de obtener una conexión de este tipo:

Solución 1: Si el primer parámetro de la función de Java es una java.sql.Connection, a continuación, la base de datos proporciona la conexión. Para SQL, este es un parámetro 'oculto', lo que significa que no puede y no necesita establecerlo explícitamente. Esto está documentado: User-Defined Functions and Stored Procedures, "Funciones que requieren una conexión". Ejemplo:

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

Solución 2: Para la compatibilidad con Apache Derby y Oracle, puede abrir una nueva conexión dentro de la función de Java utilizando DriverManager.getConnection("jdbc:default:connection"). Esta función está disponible en la versión H2 1.3.151 y posteriores, y está deshabilitada de manera predeterminada. Para habilitarlo, añada ;DEFAULT_CONNECTION=TRUEto the database URL. Es una característica problemática porque el controlador JDBC de Oracle intentará resolver la URL de esta base de datos si se carga antes del controlador H2. Así que, básicamente, no puede usar la función si el controlador de Oracle está cargado (considero que esto es un error en el controlador de Oracle).

+0

siempre cierre sus declaraciones cuando haya terminado con ellas ... Statement s = conn.createStatement(); try {return s.executeQuery (sql);} finally {s.close();} – jcalfee314

+0

Para H2 (y esto es aproximadamente H2) no importa si se cierra la declaración o no. Pero sí, en general, la declaración debe ser cerrada. –

+0

@Thomas Mueller sus ejemplos de documentación son tan pobres pondría un ejemplo de CRUD – Dunken

Cuestiones relacionadas