【问题标题】:mysql jdbc driver does not support delimiters in triggers with multiple statementsmysql jdbc 驱动程序不支持多语句触发器中的分隔符
【发布时间】:2011-03-29 17:57:20
【问题描述】:

我有一些代码由于分号错误而触发了语法错误。如果这是在命令行上运行的,我会用分隔符解决这个问题。不幸的是,jdbc4 驱动程序似乎无法识别分隔符。无论如何要让它运行?

delimiter |
CREATE TRIGGER obs_update BEFORE UPDATE ON obs
FOR EACH ROW
BEGIN
   IF OLD.voided = 0 AND NEW.voided = 1 THEN
      DELETE FROM clinic_obs WHERE id = OLD.obs_id;
   ELSE
      UPDATE clinic_obs SET clinic_obs.revision_token = NOW()
      WHERE NEW.obs_id = clinic_obs.id;
   END IF;
END;
|
delimiter ;

【问题讨论】:

    标签: mysql jdbc triggers


    【解决方案1】:

    尝试删除最后一个 END 字后的分号。所以它看起来像这样:

    delimiter |
    CREATE TRIGGER obs_update BEFORE UPDATE ON obs
    FOR EACH ROW
    BEGIN
       IF OLD.voided = 0 AND NEW.voided = 1 THEN
          DELETE FROM clinic_obs WHERE id = OLD.obs_id;
       ELSE
          UPDATE clinic_obs SET clinic_obs.revision_token = NOW()
          WHERE NEW.obs_id = clinic_obs.id;
       END IF;
    END|
    

    它应该可以工作,因为我使用 jdbc 驱动程序完成了类似的触发器/过程。

    【讨论】:

      【解决方案2】:

      Delimiter 是 SQL 客户端的命令。 JDBC 中不需要使用分隔符。 下面的例子展示了它:

      import java.sql.*;
      
      public class TriggerExample {
      
          public static void main(String args[]) {
      
              String connectionURL = "jdbc:mysql://localhost:3306/test";
              Connection con = null;
      
              try {
                  Class.forName("com.mysql.jdbc.Driver");
                  con = DriverManager.getConnection(connectionURL, "login",
                          "password");
                  Statement stmt = con.createStatement();
                  stmt.execute("CREATE TRIGGER obs_update BEFORE UPDATE ON obs "
                          + "FOR EACH ROW "
                          + "BEGIN "
                          + "IF OLD.voided = 0 AND NEW.voided = 1 THEN "
                          + "   DELETE FROM clinic_obs WHERE id = OLD.obs_id; "
                          + "ELSE "
                          + "   UPDATE clinic_obs SET clinic_obs.revision_token = NOW() "
                          + "   WHERE NEW.id = clinic_obs.id; "
                          + "END IF; "
                          + "END;");
                  con.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              } catch (Exception e) {
                  e.printStackTrace();
              } finally {
                  if (con != null) {
                      try {
                          con.close();
                      } catch (SQLException e) {
                          e.printStackTrace();
                      }
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-05-16
        • 2011-03-15
        • 2012-11-26
        • 2015-04-17
        • 2018-03-14
        • 1970-01-01
        • 2019-05-18
        • 2014-04-25
        相关资源
        最近更新 更多