Java调用具有ref cursor返回类型的存储过程

Java调用具有ref cursor返回类型的存储过程,java,stored-procedures,jdbc,plsql,callable-statement,Java,Stored Procedures,Jdbc,Plsql,Callable Statement,我一直遇到这样一个问题:当试图从存储过程返回ref游标时,我经常会遇到一个java.sql.SQLException:type length大于max错误 我有一个非常简单的存储过程,它只有一个输出变量作为ref游标,ref_游标在名为WS_SEARCHTEST的Oracle包中定义为ref游标类型 CREATE OR REPLACE PACKAGE DB.WS_SEARCHTEST IS TYPE ref_cursor IS REF CURSOR; 我的程序: PROCEDURE searc

我一直遇到这样一个问题:当试图从存储过程返回ref游标时,我经常会遇到一个java.sql.SQLException:type length大于max错误

我有一个非常简单的存储过程,它只有一个输出变量作为ref游标,ref_游标在名为WS_SEARCHTEST的Oracle包中定义为ref游标类型

CREATE OR REPLACE PACKAGE DB.WS_SEARCHTEST
IS
TYPE ref_cursor IS REF CURSOR;
我的程序:

PROCEDURE searchTest(query_result OUT ref_cursor)
Is
Begin
   open query_result for select pay_id, member_id, group_no from member_table
where carrier_no = '7' AND group_no = '200607';
End;
我知道我的连接是有效的,因为我用它来运行简单的查询,并与数据库进行了检查。在java代码中,我执行以下操作:

callStmt = connection.prepareCall("{call WS_SEARCHTEST.searchTest(?)}");
callStmt.registerOutParameter(1, OracleTypes.CURSOR);
callStmt.execute();
resultSet = (ResultSet) callStmt.getObject(1);
我也尝试过:

 resultSet = callStmt.executeUpdate();    

然而,当我尝试访问结果集时,我总是会得到java.sql.SQLException:比最大值更大的类型长度

如果您想编写一个调用PostgreSQL存储过程的java代码,请多谢 有一个INOUT refcursor。 PostgreSQL SP: 创建或替换过程读取\u数据详细信息(INOUT my\u cursor REFCURSOR='rs\u resultone') 语言plpgsql 美元 开始 打开my_光标,从MyData中选择*; 结束; $$; 相应的java代码将是: connection=getConnection(您的连接参数); if(连接!=null){ connection.setAutoCommit(false);//必须在 //连接打开,否则将无法工作,因为光标将立即关闭。 String readMetaData=“CALL Read_DataDetails(?); callableStatement=connection.prepareCall(readMetaData); callableStatement.registerOutParameter(1,Types.REF\u游标); callableStatement.execute(); rs=(ResultSet)callableStatement.getObject(1); 如果(rs!=null){ while(rs.next()){ }//结束时 }//如果结束 }//如果结束
你可以在这里得到答案吗?@Kerriwillams该链接没有帮助,因为它们返回一个整数,我可以这样做,但我不能返回一个ref游标。这也是一个自动提交问题。您使用的是什么Oracle版本?您正在使用哪个JDBCJAR(例如,ojdbc14.jar、ojdbc5.jar、ojdbc6.jar)?对于返回refcursor的函数,我已经成功地使用了类似的代码:
callStmt=connection.prepareCall(“{?=call WS\u SEARCHTEST.SEARCHTEST}”)
如果您将searchTest转换为函数,它会工作吗?@KlasLindbäck感谢您的响应,但我也尝试将其转换为函数,但是在SOAP响应中,我收到了一条空指针异常,而不是“java.sql.SQLException:类型长度大于最大值”错误消息。我有:callStmt.prepareCall({?=调用WS_SEARCHTEST.func(?,?)});
 resultSet = callStmt.executeQuery();
if you want to write a java code which will call PostgreSQL Stored procedure where 
there is an INOUT refcursor.
PostgreSQL SP:

 CREATE OR REPLACE PROCEDURE  Read_DataDetails(INOUT  my_cursor REFCURSOR = 'rs_resultone')
 LANGUAGE plpgsql
 AS $$                                                    
 BEGIN
 OPEN my_cursor FOR Select * from MyData;      
 END;
 $$;

 corresponding java code will be:

connection = getConnection(your connection parameter);
if (connection != null) {
connection.setAutoCommit(false); // This line must be written just after the 
//connection open otherwise it will not work since cursor will be closed immediately. 
String readMetaData = "CALL Read_DataDetails(?)";
callableStatement = connection.prepareCall(readMetaData);
callableStatement.registerOutParameter(1, Types.REF_CURSOR);
callableStatement.execute();
rs = (ResultSet) callableStatement.getObject(1);
if (rs != null) {
    while (rs.next()) {
                 <Your Logic>
                }//end while
            }//end if

}//end if