Hsql异常:调用存储过程时出现常规错误



我正在尝试为调用存储过程的DAO编写集成测试。 我从一个测试文件创建了一个嵌入式 HSQL 数据库,该文件只是创建一个表,填充它,以及一个返回表结果的简单存储过程:

CREATE PROCEDURE usp_GetAvailableServices()
READS SQL DATA
BEGIN ATOMIC
DECLARE result CURSOR WITH RETURN FOR SELECT FeatureType FROM PUBLIC.service_areas ;
OPEN result;
END/;

创建数据库的代码如下所示。数据库已正确创建和填充。

db = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("db/sql/getAvailableServicesStoredProcedure.sql")
.setSeparator("/;")
.build();

我的测试在尝试调用存储过程时失败,General error; nested exception is java.sql.SQLException: General error最终由

Caused by: org.hsqldb.HsqlException: General error
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
...

我运行了 HSQLDB 控制台并确认我的存储过程确实已创建(它列在information_schema.routines下(,但是当我尝试使用call usp_GetAvailableServices()直接在控制台中调用存储过程时,我仍然看到General error / Error Code: -458 / State: S1000

这让我相信我的创建过程语法有错误(根据 http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_psm_cursors 似乎是正确的(,或者我不知道如何在 HSQLDB 中正确调用例程。

使用 SqlServer 调用实时存储过程的代码工作正常。 只有HSQLDB不起作用。

你的程序很好。因为它使用OPEN cursorname CURSOR,所以不能用 DatabaseManager 或 SqlTool 调用它。你需要使用 execute(( 在 JDBC 中以这种方式调用它:

CallableStatement cs = conn.prepareCall(
"call usp_GetAvailableServices()");
boolean isResult = cs.execute();
assertFalse(isResult);
isResult = cs.getMoreResults();
ResultSet rs = cs.getResultSet();
rs.next();
// do something with the rs row
rs.close();

请注意需要 getMoreResults(( 调用。

或者,使用 executeQuery(( 来避免额外的调用。

CallableStatement cs = conn.prepareCall(
"call usp_GetAvailableServices()");
ResultSet rs = cs.executeQuery();
rs.next();
// do something with the rs row
rs.close();

下一个版本目前作为 http://hsqldb.org/downlaod 的快照 jar 提供,支持 cs.execute(( 和 cs.getResultSet(( 而不带 cs.getMoreResults((。

CallableStatement cs = conn.prepareCall(
"call usp_GetAvailableServices()");
boolean isResult = cs.execute();
ResultSet rs = cs.getResultSet();
rs.next();
// do something with the rs row
rs.close();

相关内容

最新更新