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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA获取ORACLE存储过程返回结果集的问题相关的知识,希望对你有一定的参考价值。

基本代码如下
callableDBUtil.prepareCallable("call p_cost_mainstayRpt_sum(?,?,?,?,?)");
callableDBUtil.registerOutParameter(1, OracleTypes.CURSOR);
callableDBUtil.setString(2, deptNo.toString());
callableDBUtil.setString(3, period);
callableDBUtil.setString(4, rpttype);
callableDBUtil.setString(5, selectType);

callableDBUtil.executeCallable();
OracleResultSet ors = (OracleResultSet) callableDBUtil.getObject(1);

现在这个存储过程在PL/SQL中测试能出来数据。但到了JAVA后台却获取不到。
也就是在
ORS.NETX()这里就没有进去了
换一个查不到的存储过程,却又可以获取到
说错了,换一个差不多的存储过程,一样的输出参数
v_list out SYS_REFCURSOR
这段代码又可以获取到

你存储过程中的 查询集返回语句不是最后一条,如:select * into
v_list from xxxx 要放到过程的最后一句或试下加个return v_list
参考技术A 111 参考技术B 建议检查下你的存储过程参数

SQL 2005 存储过程结果集的 ODBC 执行/获取不能使用表 @variable

【中文标题】SQL 2005 存储过程结果集的 ODBC 执行/获取不能使用表 @variable【英文标题】:ODBC Execute/Fetch of SQL 2005 stored procedure result set cannot use a table @variable 【发布时间】:2010-02-12 21:34:07 【问题描述】:

我正在对 SQL Server 2005(本机客户端)使用 ODBC 和 C++。 我有以下简单的测试存储过程,它返回两行常量值:

CREATE PROCEDURE usp_testme AS BEGIN  
   declare @details table( one int, two int, three int, four int )  
   insert @details SELECT 1 one, 2 two, 3 three, 4 four UNION SELECT 5, 6, 7, 8  
   select one, two, three, four from @details  
END  

ODBC 代码如下所示(简化):

SQLExecDirect( m_hstmt, (SQLCHAR *)"CALL usp_testme", SQL_NTS );
SQLFetch( m_hstmt );   

SQLExecDirect() 调用返回以下信息:

INFO: 16954 : 01000 : [Microsoft etc]Executing SQL directly; no cursor  

然后 SQLFetch() 调用给出:

INFO: 0 : 24000 : [Microsoft etc]Invalid cursor state  

ODBC 参考文档告诉我的是我没有结果集。 所以我将存储过程更改为以下内容(例如,不使用表变量):

CREATE PROCEDURE usp_testme AS BEGIN  
 SELECT 1 one, 2 two, 3 three, 4 four UNION SELECT 5, 6, 7, 8  
END  

瞧,它有效。当然这是一个简单的测试程序,我需要执行的真正的SQL比较复杂,需要表变量,不用赘述。但是为什么不能针对第一个 SP 的结果集创建 (ODBC) 游标呢?

有谁知道如何让它工作? 顺便说一句,我在环境句柄上声明 ODBC v3。我在连接句柄上尝试了不同的光标属性,但无济于事。

非常感谢您的帮助!

【问题讨论】:

有没有可以用来执行 SQL 语句而不是查询的函数?根据定义,查询返回结果。因此,您需要执行 SQL 但不返回结果的功能。 我看不出这对我有什么帮助。我的问题是我无法在我的 ODBC 应用程序中获取由 SELECT 创建的结果集的行。我确实想要一个结果集,而不仅仅是执行 SQL。我不确定你的意思。 【参考方案1】:

问题是语句上的可滚动游标设置,更改为不可滚动游标解决了问题。

【讨论】:

所以请接受它作为正确答案,这样我们可以很容易地看到它已经解决了

以上是关于JAVA获取ORACLE存储过程返回结果集的问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle 如何返回多条记录

Oracle中函数/过程返回结果集的几种方式

请问MyBatis.net 如何执行一个不需要参数但返回结果集的oracle数据库的存储过程?

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

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀

java中如何获取oracle存储过程返回的多个值。