【问题标题】:Java calling a stored proc with ref cursor return typeJava 调用具有 ref 游标返回类型的存储过程
【发布时间】:2014-04-22 23:54:37
【问题描述】:

我遇到了一个问题,在尝试从存储过程返回引用游标时,我经常收到 java.sql.SQLException: Bigger type length than Maximum 错误。

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

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();    

 resultSet = callStmt.executeQuery();

但是当我尝试访问结果集时,我总是会得到 java.sql.SQLException: Bigger type length than Maximum。

谢谢

【问题讨论】:

  • 你可以在这里得到你的答案stackoverflow.com/questions/14900708/…>?
  • @KerriWilliams 该链接没有帮助,因为它们返回一个整数,我可以这样做,但我无法返回参考光标。这也是一个自动提交问题。
  • 您使用的是哪个 Oracle 版本?您使用的是哪个 JDBC jar(例如 ojdbc14.jar、ojdbc5.jar、ojdbc6.jar)?
  • 我已经成功地将代码用于返回引用的函数:callStmt = connection.prepareCall("{ ? = call WS_SEARCHTEST.searchTest }"); 如果将 searchTest 转换为函数,它是否有效?
  • @KlasLindbäck 感谢您的回复,但我也尝试将其转换为函数,但是我收到空指针异常,而不是“java.sql.SQLException: Bigger type length than Maximum”错误消息在我的 SOAP 响应中。我有: callStmt.prepareCall("{? = call WS_SEARCHTEST.func(?,?,?)}");

标签: java stored-procedures jdbc plsql callable-statement


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多