Драйвер mysql jdbc не поддерживает разделители в триггерах с несколькими операторами - PullRequest
9 голосов
/ 14 августа 2010

У меня есть код, который вызывает синтаксическую ошибку из-за неуместных точек с запятой если бы это выполнялось в командной строке, я бы решил это с помощью разделителя. К сожалению, драйвер 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 ;

Ответы [ 2 ]

6 голосов
/ 17 марта 2012

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();
                }
            }
        }
    }
}
0 голосов
/ 28 марта 2012

Попробуйте удалить точку с запятой после последнего слова 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...