Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Fehler bei der MySQL-Trennzeichenanweisung

Dies scheint ein Duplikat von Play framework 2.0 evolutions and create trigger zu sein (Beachten Sie, dass meiner Meinung nach die bessere Antwort die von Roger am 24. Mai 2013 gepostete ist, dh der Link oben)

„Trennzeichen“ kann nicht im Text des Evolutionsskripts verwendet werden; Ich kann anscheinend keine Dokumentation finden, warum dies so ist. Aber vielleicht hat es damit zu tun, dass "delimiter" kein SQL-Statement, sondern eine SQL-Property ist.

Es gibt jedoch eine Lösung im Evolutions-Abschnitt der Play 2-Dokumentation :

Play teilt Ihre .sql-Dateien in eine Reihe von durch Semikolons getrennten Anweisungen auf, bevor sie einzeln gegen die Datenbank ausgeführt werden. Wenn Sie also innerhalb einer Anweisung ein Semikolon verwenden müssen, maskieren Sie es, indem Sie;; Anstatt von;. Beispiel:INSERT INTO Interpunktion(Name, Zeichen) VALUES ('Semikolon', ';;');.

Also in Ihrem Fall

  1. Entfernen Sie die Eigenschaft "delimiter" und
  2. Verwenden Sie ";;" Anstatt von ";" für Ihr Inneres SQL-Anweisungen, um zu verhindern, dass der Play 2-Parser diese inneren SQL-Anweisungen separat ausführt.

Hier ist ein Beispiel, das ich erfolgreich in Play 2.3 und mysql 14.14 Distrib 5.5.40 (Ubuntu 12.04LTS) getestet habe:

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;

Im Fall Ihres SQL-Skripts sollte Folgendes mit Play 2.1 und höher funktionieren (beachten Sie, dass ich es nicht getestet habe):

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;