无法使用 refcursor 调用 Redshift 存储过程

Posted

技术标签:

【中文标题】无法使用 refcursor 调用 Redshift 存储过程【英文标题】:Unable to call Redshift stored procedure using refcursor 【发布时间】:2021-11-26 13:12:23 【问题描述】:

我关注了这份文件https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-result-set.html 但似乎不完整,没有引用statement对象,该对象用于从refcursor中提取数据

我尝试了各种方法

PreparedStatement statement = connection.
                    prepareStatement("call myproc( null, null, 3, 4, 'rs' )");
      boolean bb = statement.execute();
ResultSet resultSet = statement.executeQuery("fetch all from rs")

上面的代码失败了

java.sql.SQLNonTransientException: [Amazon][JDBC](11200) Invalid operation for this statement object

还尝试创建一个新的prepareStatement对象

PreparedStatement statement = connection.
                    prepareStatement("call myproc( null, null, 3, 4, 'rs' )");
      boolean bb = statement.execute();
PreparedStatement p = connection.prepareStatement("fetch all from rs")
 ResultSet resultSet = p.executeQuery()

上面的语句失败了

"INTERNAL_SERVER_ERROR","message":"java.sql.SQLException: [Amazon](500310) Invalid operation: cursor \"rs\" does not exist;"

Gradle.properties 条目

     dependency(group: 'com.amazon.redshift', name: 'redshift-jdbc42-no-awssdk', version: '1.2.37.1061')
            dependencySet(group: "com.amazonaws", version: "1.11.688") 
                entry "aws-java-sdk-s3"
                entry "aws-java-sdk-sts"
                entry "aws-java-sdk-redshift"
            ;

【问题讨论】:

【参考方案1】:

我又尝试了一些东西并获得了成功。

  try (PreparedStatement statement =
                 connection.prepareStatement
                         ("call myproc( null, null, 3, 4, 'rs' )")) 
        statement.execute();
        try (PreparedStatement p = connection.prepareStatement("fetch all from rs")) 
            try (ResultSet resultSet = p.executeQuery()) 

            
        
     catch (SQLException e) 
        e.printStackTrace();
    

我不知道为什么这段代码有效。 refcursor 的一件事永远不要将 Autocommit 设置为 true。

【讨论】:

以上是关于无法使用 refcursor 调用 Redshift 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

在另一个过程中使用 sys_refcursor 作为 out 参数调用 SP

无法在实体框架中映射 SYS_REFCURSOR

无法使用 Hibernate 和 Oracle 11g 数据库读取 Spring Boot 应用程序中的第二个 Refcursor

在过程或函数中使用 SYS_REFCURSOR

如何使用多个表循环 SYS_REFCURSOR?

使用simplejdbccall时如何在spring中关闭refcursor