java - 从 Java 执行 PostgreSQL anon block

标签 java postgresql jdbc

你好我有 PostgreSQL 一个匿名 block ,例如,DATA 是 java 中的一个字符串变量(我的匿名 block 在其中)

DO $$DECLARE  new_issue  text;
BEGIN
   new_issue := ?; 
   UPDATE FORM9902 SET HAS_ISSUE = 'Y',ISSUE_DESC = ISSUE_DESC || new_issue
   WHERE FORM990_ID = ?;
 END $$;

我正在执行上面的代码块

PreparedStatement preparedStatement = connection.prepareStatement(DATA);
preparedStatement.setString(1, "hai");
preparedStatement.setLong(2, new Long(0));

preparedStatement.executeUpdate();

但它抛出如下异常。

org.postgresql.util.PSQLException: The column index is out of range: 1, number of columns: 0.
at org.postgresql.core.v3.SimpleParameterList.bind(SimpleParameterList.java:63)
at org.postgresql.core.v3.SimpleParameterList.setStringParameter(SimpleParameterList.java:126)
at org.postgresql.jdbc.PgPreparedStatement.bindString(PgPreparedStatement.java:1096)
at org.postgresql.jdbc.PgPreparedStatement.setString(PgPreparedStatement.java:369)
at org.postgresql.jdbc.PgPreparedStatement.setString(PgPreparedStatement.java:353)
at sample.TestMain.main(TestMain.java:20)

任何人都可以帮助我解决这个问题或指出我可以纠正自己的正确资源。

最佳答案

PostgreSQL 协议(protocol)不提供将参数绑定(bind)到非计划语句(或非查询参数点)的方法。这意味着您不能参数化此类语句。换句话说,您不能在这样的 do block 中绑定(bind)参数。

堆栈跟踪显示这是您的问题。您需要自己清理参数并进行字符串插值。

更好的方法是拥有一个可以将这些作为参数传入的函数。

关于java - 从 Java 执行 PostgreSQL anon block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709762/

相关文章:

java - 动态检查实例是否实现了接口(interface)

java - 我们如何使用spring注解实现controllerclassnamehandlermapping

java - Java等待中的 Action 监听器

sql - Postgresql - 加入两个表,其中结果有附加列,其中值来自 t2

java - 设置 IntelliJ IDEA 运行一类应用程序

sql - 如何在 WHERE 和 HAVING 中查询同一列

sql - 将文件名合并到 Redshift COPY 中

java - 使用jdbc连接器在java中的一个查询中进行多个选择-Mysql

java - Postgres如何获取海量数据

mysql - 为 SQL PreparedStatement 动态添加列 - 仍然可以安全地防止注入(inject)吗?