如何定义 java 定义的存储过程以返回多个结果集?

Posted

技术标签:

【中文标题】如何定义 java 定义的存储过程以返回多个结果集?【英文标题】:How do I define a java defined stored proc to return multiple result sets? 【发布时间】:2020-07-29 22:50:43 【问题描述】:

我正在尝试定义一个 java(用 Kotlin 编写)方法,该方法在作为存储过程调用时返回多个结果集。代码如下。 Hsqldb website;s features page表明这应该是可能的,我错过了什么?我目前在索引 1 上遇到数组越界错误:

val createProcedure = """
 CREATE PROCEDURE GET_CACHED(dir VARCHAR(100), hashCode INT)
   MODIFIES SQL DATA 
   LANGUAGE JAVA
   DYNAMIC RESULT SETS 9
   EXTERNAL NAME 'CLASSPATH:integration.FileCache.getResultSets'
"""
@JvmStatic
@Throws(SQLException::class)
public fun getResultSets(conn: Connection, dir: String, hashCode: Int, result: Array<ResultSet?>) 
    val file = getFile(dir, hashCode, "sql")
    //A list of cached sql statements
    val sqlList = BufferedReader(InputStreamReader(file.inputStream())).readLines()
    val stmt = conn.createStatement()
    for(i in sqlList.indices) 
        result[i] =  stmt.executeQuery(sqlList[i])
    

鉴于我可以设置断点并到达函数内部,我认为我不需要再添加任何代码,但如果有错误请告诉我。

我正在寻找一个可以处理多个结果集以用于测试目的的内存数据库(我们正在对应用程序进行现代化改造,首先设置测试,容器化测试目前遥不可及)。我已经尝试过 H2、sqlite 和现在的 hsqldb,如果有更好的解决方案我愿意接受。

【问题讨论】:

【参考方案1】:

HSQLDB 支持多结果测试,但指南指出:HyperSQL support this method of returning single or multiple result sets from SQL/PSM procedures only via the JDBC CallableStatement interface. 注意引用 SQL/PSM,而不是 SQL/JRT。目前没有 Java 机制可以从 Java 语言 PROCEDURE 返回多个结果集。

出于测试目的,您可以使用由用 SQL 编写的 SQL/PSM CREATE PROCEDURE 语句组成的文本模板,其中包含您要执行的实际 SQL 语句的占位符。使用文件中的测试 SQL 语句处理模板并执行生成的 CREATE PROCEDURE 语句。

【讨论】:

以上是关于如何定义 java 定义的存储过程以返回多个结果集?的主要内容,如果未能解决你的问题,请参考以下文章

oracle中的存储过程如何返回查询到的多个值?

oracle 存储过程返回结果集怎么实现?用java如何调用这个存储过程?比如表scott下的emp表

oracle 如何返回多条记录

JAVA获取ORACLE存储过程返回结果集的问题

在实体框架数据库优先方法中,如何从存储过程返回多个结果集?

如何将单个结果集从返回多个集的 SQL 存储过程保存到临时表?