sql >> Base de Datos >  >> RDS >> Mysql

Error de declaración del delimitador de MySQL

Esto parece ser un duplicado de Reproducir evoluciones de framework 2.0 y crear disparador (Tenga en cuenta que, en mi opinión, la mejor respuesta es la publicada por Roger el 24 de mayo de 2013, es decir, el enlace de arriba)

"delimitador" no se puede utilizar en el texto del script de evolución; Parece que no puedo encontrar ninguna documentación sobre por qué esto es así. Pero tal vez tenga que ver con el hecho de que "delimitador" no es una declaración de SQL sino una propiedad de SQL.

Sin embargo, hay una solución en la sección Evoluciones de la documentación de Play 2 :

Play divide sus archivos .sql en una serie de declaraciones delimitadas por punto y coma antes de ejecutarlas una por una en la base de datos. Entonces, si necesita usar un punto y coma dentro de una declaración, escápelo ingresando;; en vez de;. Por ejemplo, INSERTAR EN VALORES de puntuación (nombre, carácter) ('punto y coma', ';;');.

Entonces, en su caso,

  1. Elimine la propiedad "delimitador" y
  2. Utilice ";;" en vez de ";" para tu interior Sentencias SQL, para evitar que el analizador de Play 2 ejecute estas sentencias SQL internas por separado.

Aquí hay un ejemplo que probé con éxito en Play 2.3 y mysql 14.14 Distrib 5.5.40 (Ubuntu 12.04LTS):

DROP TRIGGER IF EXISTS SOFTWARE_INSERT_CT_TRIGGER;
CREATE TRIGGER SOFTWARE_INSERT_CT_TRIGGER
BEFORE INSERT ON SOFTWARE
FOR EACH ROW
BEGIN
  IF NEW.CREATED_TIME = '0000-00-00 00:00:00' THEN
    SET NEW.CREATED_TIME = NOW();;
  END IF;;
END;

En el caso de su secuencia de comandos SQL, lo siguiente debería funcionar con Play 2.1 y superior (tenga en cuenta que no lo he probado):

DROP TRIGGER IF EXISTS invoice_line_insert;
CREATE TRIGGER invoice_line_insert AFTER INSERT
ON invoice_line FOR EACH ROW
BEGIN
  IF NEW.type = "DELIVERY" THEN
    UPDATE invoice
    SET invoice.etdelivery_amount = invoice.etdelivery_amount + NEW.amount
    WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
  ELSE
    UPDATE invoice
    SET invoice.etexpense_amount = invoice.etexpense_amount + NEW.amount
    WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
  END IF;;
  UPDATE invoice
  SET invoice.vatamount = (NEW.amount * ((
    SELECT vat.rate
    FROM vat
    WHERE vat.id_vat = NEW.vat_id_vat
  ) / 100)) + invoice.vatamount
  WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;

  UPDATE invoice
  SET invoice.itamount = invoice.vatamount +
    invoice.etdelivery_amount +
    invoice.etexpense_amount
  WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
END;