Mysql
 sql >> Base de données >  >> RDS >> Mysql

Erreur d'instruction de délimitation MySQL

Cela semble être un doublon de Play framework 2.0 evolutions and create trigger (Notez que, selon moi, la meilleure réponse est celle postée par Roger le 24 mai 2013, c'est-à-dire le lien ci-dessus)

"délimiteur" ne peut pas être utilisé dans le texte du script d'évolution ; Je n'arrive pas à trouver de documentation expliquant pourquoi il en est ainsi. Mais peut-être que cela a à voir avec le fait que "delimiter" n'est pas une instruction SQL mais une propriété SQL.

Cependant, il existe une solution dans la section Evolutions de Play 2 docs :

Play divise vos fichiers .sql en une série d'instructions délimitées par des points-virgules avant de les exécuter une par une dans la base de données. Ainsi, si vous avez besoin d'utiliser un point-virgule dans une instruction, échappez-le en saisissant ;; à la place de;. Par exemple, INSERT INTO punctuation(nom, caractère) VALUES ('point-virgule', ';;');.

Donc dans votre cas,

  1. Supprimez la propriété "delimiter", et
  2. Utilisez " ; " à la place de ";" pour votre intérieur instructions SQL, afin d'empêcher l'analyseur Play 2 d'exécuter ces instructions SQL internes séparément.

Voici un exemple que j'ai testé avec succès dans Play 2.3 et 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;

Dans le cas de votre script SQL, les éléments suivants devraient fonctionner avec Play 2.1 et versions ultérieures (notez que je ne l'ai pas testé) :

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;