1

我有一个存储过程

CREATE OR REPLACE FUNCTION fun_retrieve_vector_receipt_payment_details(character varying, integer, character varying, character varying, character varying, refcursor)  RETURNS refcursor AS

这是我的java代码

con.setAutoCommit(false);
        String sql = "{call fun_retrieve_vector_receipt_payment_details(?,?,?,?,?,?)}";
        callableStatement = con.prepareCall(sql);
        callableStatement.setString(1, "PAYMENT");
        callableStatement.setInt(2, 41);
        callableStatement.setString(3, "2011-05-06");
        callableStatement.setString(4, "2013-05-06");
        callableStatement.setString(5, "Y");
        callableStatement.setObject(6, rs);
        callableStatement.registerOutParameter(6, Types.OTHER);

        callableStatement.execute();

        ResultSet resultSet = (ResultSet) callableStatement.getObject(6);
        //          rs = callableStatement.executeQuery();
        boolean next = resultSet.next();
        if (next)
        {
            System.out.println(resultSet.getString(1));
        }

为什么我的结果集为空?
我应该将什么作为 refcursor 作为来自 java 的参数传递?

我正在使用 postgres 作为我的数据库

4

2 回答 2

1

refcursor 是光标的名称 - 所以它是字符串。所以你必须得到一个这个名字,你可以把它作为字符串传递:

postgres=#开始;
开始
时间:0.398 毫秒
postgres=# 为 select * from f1 声明 xxx 光标;
声明光标
时间:23.409 毫秒
postgres=# 选择 fx('xxx');
通知:(10,20)
通知:(340,30)
 外汇
────

(1 行)

犯罪;

创建或替换函数 public.fx(refcursor)
 退货无效
 语言 plpgsql
作为$函数$
申报 r 记录;
开始
  虽然是真的
  环形
    取 $1 到 r 中;
    找不到时退出;
    提高通知 '%', r;
  结束循环;
结尾;
$函数$
于 2013-09-23T05:05:47.057 回答
1

试试这个方法:

Statement stmt = conn.createStatement();
stmt.execute("CREATE OR REPLACE FUNCTION "
        +" fun_retrieve_vector_receipt_payment_details(x1 integer, x2 integer )"
        + " RETURNS refcursor AS '"
        + " DECLARE "
        + "    mycur refcursor; "
        + " BEGIN "
        + "    OPEN mycur FOR SELECT x FROM generate_series( x1, x2 ) x; "
        + "    RETURN mycur; "
        + " END;' language plpgsql");
stmt.close();

conn.setAutoCommit(false);

CallableStatement proc = conn.prepareCall(
         "{ ? = call fun_retrieve_vector_receipt_payment_details( ?, ?  ) }");
proc.registerOutParameter(1, Types.OTHER);
proc.setInt(2 , 13 );
proc.setInt(3 , 17 );
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
    System.out.println(results.getString(1));
}

results.close();
proc.close();
conn.close();

 

Run ...
13
14
15
16
17
于 2013-09-21T20:05:01.603 回答