2010-06-23 4 views
16

Est-ce que quelqu'un a essayé de créer des procédures stockées en utilisant la base de données H2?Comment créer une procédure stockée en utilisant la base de données H2?

+0

Mon problème avec l'utilisation des fonctions Java est différent de [celui-ci] (http://stackoverflow.com/questions/3098905/how-to-create-stored-procedure-using-h2-database). Je ne sais pas comment accéder aux tables dans une telle fonction (créer une connexion n'a aucun sens là-dedans, n'est-ce pas)? – maaartinus

+0

Il est toujours utile de regarder le manuel: [H2: Fonctions définies par l'utilisateur et procédures stockées] (http://www.h2database.com/html/features.html#user_defined_functions) – NullUserException

Répondre

9

Pour accéder à la base de données dans une fonction Java, vous avez besoin d'une connexion. Pour H2, il y a deux façons d'obtenir une telle connexion:

Solution 1: Si le premier paramètre de la fonction Java est une java.sql.Connection, la base de données fournit la connexion. Pour SQL, il s'agit d'un paramètre "caché", ce qui signifie que vous ne pouvez pas et ne devez pas le définir explicitement. Ceci est documenté: User-Defined Functions and Stored Procedures, "Fonctions qui nécessitent une connexion". Exemple:

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

Solution 2: Pour la compatibilité avec Apache Derby et Oracle, vous pouvez ouvrir une nouvelle connexion au sein de la fonction Java à l'aide DriverManager.getConnection("jdbc:default:connection"). Cette fonctionnalité est disponible dans H2 version 1.3.151 et plus récente, et elle est désactivée par défaut. Pour l'activer, ajoutez ;DEFAULT_CONNECTION=TRUEto the database URL. C'est une fonctionnalité problématique car le pilote Oracle JDBC va essayer de résoudre cette URL de base de données si elle est chargée avant le pilote H2. Donc, fondamentalement, vous ne pouvez pas utiliser la fonction si le pilote Oracle est chargé (je considère cela comme un bug dans le pilote Oracle).

+0

toujours fermer vos instructions lorsque vous en avez fini avec elles ... Déclaration s = conn.createStatement(); try {return s.executeQuery (sql);} finally {s.close();} – jcalfee314

+0

Pour H2 (et c'est à propos de H2) peu importe si vous fermez la déclaration ou non. Mais oui, généralement la déclaration devrait être fermée. –

+0

@Thomas Mueller vos exemples de documentation sont si pauvres mettriez-vous des exemples CRUD – Dunken

Questions connexes