首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在从java调用时将游标变量传递给postgres过程?

如何在从java调用时将游标变量传递给postgres过程?
EN

Stack Overflow用户
提问于 2021-09-13 09:59:20
回答 1查看 730关注 0票数 0

我正在调用spring应用程序中的postgres存储过程,其中包含类型为text的一个IN参数和一个类型refcursor的INOUT参数。如何从CallableStatement以外的springboot应用程序调用此过程。

代码语言:javascript
复制
public class CallProc {
    public static void main(String[] args) throws ClassNotFoundException, java.sql.SQLException {
        
        Class.forName("org.postgresql.Driver");
        
        String url = "jdbc:postgresql://azure.com/test";
        Properties props = new Properties();
        props.setProperty("user","test");
        props.setProperty("password","test");
        props.setProperty("ssl","true");
        props.setProperty("escapeSyntaxCallMode", "callIfNoReturn");
        Connection conn = DriverManager.getConnection(url, props);

        // need a transaction
        conn.setAutoCommit(false);

        java.sql.CallableStatement callableStatement =
            conn.prepareCall("{call myProc(?, ?)}");

        callableStatement.setString(1, "user");
        callableStatement.setObject(2, null);

        callableStatement.registerOutParameter(2, java.sql.Types.REF_CURSOR);

        callableStatement.execute();
       
        java.sql.ResultSet rs =
            (java.sql.ResultSet) callableStatement.getObject(2);

        while (rs.next())
            System.out.println(rs.getInt(1));

        rs.close();
        conn.commit();

        conn.close();
    }
}

我的程序定义是这样的,

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE myapp.MyProc(
     in_user_id TEXT,
     INOUT user_roles refcursor)
language plpgsql
AS $BODY$
DECLARE

DERIVED USER_ID VARCHAR(50);

BEGIN
//body
...
//
END
$BODY$

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-13 12:51:14

若要使用java.sql.CallableStatement调用过程,请使用带有值callcallIfNoReturn的连接参数escapeSyntaxCallMode,并且不指定返回参数。正如文献资料所说:

escapeSyntaxCallMode = String 指定驱动程序如何将JDBC转义调用语法转换为底层SQL,以调用过程或函数。在escapeSyntaxCallMode=select模式下(默认情况下),驱动程序总是使用SELECT语句(只允许函数调用)。在escapeSyntaxCallMode=callIfNoReturn模式下,如果没有指定返回参数,驱动程序将使用调用语句(允许过程调用),否则驱动程序使用SELECT语句。在escapeSyntaxCallMode=call模式下,驱动程序总是使用CALL语句(只允许过程调用)。

问题是在v11中添加过程之前,JDBC驱动程序将CallableStatement调用转换为函数调用,而函数调用不适用于过程。

下面是一个调用过程p(IN integer, INOUT refcursor)的代码示例,其中refcursor位于integer的结果集上:

代码语言:javascript
复制
public class CallProc {
    public static void main(String[] args) throws ClassNotFoundException, java.sql.SQLException {
        Class.forName("org.postgresql.Driver");

        java.sql.Connection conn =
            java.sql.DriverManager.getConnection(
                "jdbc:postgresql:test?user=laurenz&password=something&escapeSyntaxCallMode=callIfNoReturn"
            );

        // need a transaction
        conn.setAutoCommit(false);

        java.sql.CallableStatement callableStatement =
            conn.prepareCall("{call p(?::text, ?::refcursor)}");

        callableStatement.setInt(1, 5);
        callableStatement.setObject(2, null);

        callableStatement.registerOutParameter(2, java.sql.Types.REF_CURSOR);

        callableStatement.execute();
       
        java.sql.ResultSet rs =
            (java.sql.ResultSet) callableStatement.getObject(2);

        while (rs.next())
            System.out.println(rs.getInt(1));

        rs.close();
        conn.commit();

        conn.close();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69160761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档