2016-06-08 44 views
2

您好PostgreSQL的匿名块I的PostgreSQL一个匿名块,例如,数据是在Java String变量(其中我的匿名块)执行从Java

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) 

任何人都可以帮助我,或指向正确的资源,我可以纠正我的自我。

回答

0
String updsql = " UPDATE FORM9902 SET HAS_ISSUE = 'Y', ISSUE_DESC = ISSUE_DESC || ? WHERE FORM990_ID = ? "; 
PreparedStatement preparedStatement = connection.prepareStatement(updsql); 
preparedStatement.setString(1, "hai"); 
preparedStatement.setLong(2, 0L); 

preparedStatement.executeUpdate(); 
2

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

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

更好的方法是有一个函数,您可以将它们作为参数传递。