Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将游标作为参数传递给存储过程并在java中捕获它_Java_Postgresql_Jdbc - Fatal编程技术网

如何将游标作为参数传递给存储过程并在java中捕获它

如何将游标作为参数传递给存储过程并在java中捕获它,java,postgresql,jdbc,Java,Postgresql,Jdbc,我有一个存储过程 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

我有一个存储过程

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));
        }
为什么我将resultset设置为null? 我应该从java将什么作为refcursor作为参数传递

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

尝试以下方法:

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


refcursor是游标的名称,所以它是字符串。因此,您必须获取此名称的字符串,并可以将其作为字符串传递:

postgres=# begin; BEGIN Time: 0.398 ms postgres=# declare xxx cursor for select * from f1; DECLARE CURSOR Time: 23.409 ms postgres=# select fx('xxx'); NOTICE: (10,20) NOTICE: (340,30) fx ──── (1 row) commit; CREATE OR REPLACE FUNCTION public.fx(refcursor) RETURNS void LANGUAGE plpgsql AS $function$ declare r record; begin while true loop fetch $1 into r; exit when not found; raise notice '%', r; end loop; end; $function$
那是什么?你从哪里拿的? postgres=# begin; BEGIN Time: 0.398 ms postgres=# declare xxx cursor for select * from f1; DECLARE CURSOR Time: 23.409 ms postgres=# select fx('xxx'); NOTICE: (10,20) NOTICE: (340,30) fx ──── (1 row) commit; CREATE OR REPLACE FUNCTION public.fx(refcursor) RETURNS void LANGUAGE plpgsql AS $function$ declare r record; begin while true loop fetch $1 into r; exit when not found; raise notice '%', r; end loop; end; $function$