Prepared Statement 因 DB2 SQL 错误而失败

Posted

技术标签:

【中文标题】Prepared Statement 因 DB2 SQL 错误而失败【英文标题】:Prepared Statement failing with DB2 SQL error 【发布时间】:2016-01-25 14:07:59 【问题描述】:

我正在尝试执行以下代码。

public static void main(String[] args) throws Exception 
        Connection connection = null;
        try 
            Class.forName("com.ibm.db2.jcc.DB2Driver");
         catch (ClassNotFoundException ex) 
            ex.printStackTrace();
        
        try 
            System.out.println();
             connection = DriverManager.getConnection("jdbc:db2://localhost:port/database", username, password);
             connection.setAutoCommit(false);
            // String plsql = "BEGIN INSERT INTO t VALUES(42); COMMIT; END;";
            String plsql = "BEGIN UPDATE TABLE SET PROPERTY_VALUE='test6' where property_name='TEST'; COMMIT; END;";
            PreparedStatement pstatement = connection.prepareStatement(plsql);
            pstatement.execute();


         catch (SQLException ex) 
            ex.printStackTrace();
        
    

我收到以下错误:

com.ibm.db2.jcc.b.co: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=END;NAME='TEST'; COMMIT;;END, DRIVER=3.53.70

如何解决此问题。为什么在这种情况下支持准备好的语句?

【问题讨论】:

您需要删除语句中END 之后的最后一个分号。 我尝试在 END 后删除分号。现在我得到了不同的错误.. com.ibm.db2.jcc.b.co: DB2 SQL 错误:SQLCODE=-104, SQLSTATE=42601, SQLERRMC=call BEGIN;BEGIN-OF-STATEMENT;, DRIVER= 3.53.70 你发现了吗?我有同样的问题。 【参考方案1】:

我认为您需要使用对connection.commit() 的JDBC 调用来commit 事务。

这个article 给了你一个很好的例子。

您的代码将在正文中更改为以下内容

public static void main(String[] args) throws Exception 
    Connection connection = null;
    try 
        Class.forName("com.ibm.db2.jcc.DB2Driver");
     catch (ClassNotFoundException ex) 
        ex.printStackTrace();
    
    try 
         System.out.println();
         connection = DriverManager.getConnection("jdbc:db2://localhost:port/database", username, password);
         connection = DriverManager.getConnection("jdbc:db2://localhost:port/database", username, password);
         connection.setAutoCommit(false);
         String plsql = "UPDATE AR01.REBILL_PROPERTIES SET PROPERTY_VALUE='test6' where property_name='TEST'";
         PreparedStatement pstatement = connection.prepareStatement(plsql);
         pstatement.executeUpdate();
         connection.commit();
     catch (SQLException ex) 
        connection.rollback();
        ex.printStackTrace();
    

希望这会有所帮助。

【讨论】:

以上是关于Prepared Statement 因 DB2 SQL 错误而失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 Prepared Statement 设置 LONG 数据类型

当 Statement 与 Java 和 Oracle 一起使用时,Prepared Statement 不起作用

MySQL Prepared Statement:更新多个值

MYSQLI Prepared statement update statement with where in array

未找到 Java Prepared statement 错误表

JAVA JDBC mySql Prepared statement 更新查询 [重复]