2010-06-23 423 views
16

有没有人试图用H2数据库创建存储过程?如何使用H2数据库创建存储过程?

+0

我使用Java函数的问题与[this one]不同(http://stackoverflow.com/questions/3098905/how-to-create-stored-procedure-using-h2-database)。我不知道如何在这样的函数中访问表(创建连接在那里没有意义,是吗?)? – maaartinus 2011-03-18 12:06:31

+0

查看手册总是很有帮助:[H2:用户定义的函数和存储过程](http://www.h2database.com/html/features.html#user_defined_functions) – NullUserException 2010-10-07 03:52:48

回答

9

要访问Java函数中的数据库,您确实需要连接。对于H2,有两种方法可以获得此类连接:

解决方案1 ​​:如果Java函数的第一个参数是java.sql.Connection,则数据库提供连接。对于SQL,这是一个'隐藏'参数,这意味着你不能也不需要明确设置它。记录如下:User-Defined Functions and Stored Procedures,“需要连接的功能”。例如:

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

解决方案2:对于Apache Derby和甲骨文的兼容性,您可以打开使用DriverManager.getConnection("jdbc:default:connection")的Java函数中的一个新的连接。此功能在H2版本1.3.151及更新的版本中可用,并且默认情况下它是禁用的。要启用它,请附加;DEFAULT_CONNECTION=TRUEto the database URL。这是一个有问题的功能,因为如果Oracle驱动程序在H2驱动程序之前加载,Oracle JDBC驱动程序将尝试解析此数据库URL。因此,如果加载Oracle驱动程序,基本上不能使用该功能(我认为这是Oracle驱动程序中的一个错误)。

+0

当你完成它们时总是关闭你的语句...声明s = conn.createStatement();尝试{返回s.executeQuery(sql);}终于{s.close();} – jcalfee314 2013-08-05 19:20:51

+0

对于H2(这是关于H2),没关系,如果你关闭该声明与否。但是,一般来说,声明应该被关闭。 – 2013-08-05 19:47:23

+0

@Thomas Mueller你的文档例子很差,你会把一个CRUD例子 – Dunken 2016-03-29 10:47:50