无法使用 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
无法使用 Hibernate 和 Oracle 11g 数据库读取 Spring Boot 应用程序中的第二个 Refcursor