2014-09-01 39 views
1

我想在mysql中運行以下腳本:MySQL的分隔符語句錯誤

DELIMITER $$$ 
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 
$$$ 

當我在MySQL Workbench中運行它,它工作正常,但是當比賽2來看,它authomatically(在一個名爲2.sql)我收到以下錯誤:

您的SQL語法錯誤;請檢查與您的MySQL服務器版本相對應的手冊,以便在第1行[錯誤:1064,SQLSTATE:42000]處使用'DELIMITER $$$ DROP TRIGGER IF EXTRTS invoice_line_insert $$$ CREATE TRIGGER invo'附近的正確語法運行這個SQL腳本:

我在網上看到,分隔符語句只針對特定的gui,而不是每次。真的嗎 ?爲什麼?如何解決它,因爲我需要分隔符語句?

感謝您的幫助。

+0

你不需要第二個分隔符'DROP TRIGGER IF EXISTS invoice_line_insert $$$'刪除其已經存在的頂部。 – 2014-09-01 10:49:29

+0

@AhhikChakraborty謝謝,但它沒有解決問題。 – Moebius 2014-09-01 10:54:01

+0

在第一個語句之後添加一個';'DROP TRIGGER IF EXUSTS invoice_line_insert;' – 2014-09-01 10:57:03

回答

4

這似乎是Play framework 2.0 evolutions and create trigger 重複(需要注意的是,在我看來,更好的答案是一個發佈由Roger於2013年5月24日,也就是上面的鏈接)「分隔符」不能用

在進化腳本文本中;我似乎無法找到任何文件,爲什麼這是如此。但也許這與「分隔符」不是SQL語句而是SQL屬性有關。

然而,在Evolutions section of Play 2 docs的解決方案:

播放一個接一個對數據庫執行之前將您的.sql文件成一系列分號分隔的語句。因此,如果您需要在語句中使用分號,請輸入;;來避免它。代替 ;。例如,INSERT INTO標點符號(名稱,字符)VALUES('分號',';;');.你的情況

所以,

  1. 去掉 「分隔符」 屬性,
  2. 使用 「;;」代替 」;」爲了讓你的內部的 SQL語句,以防止Play 2解析器單獨執行這些內部SQL語句。

下面是我在玩2.3測試成功的例子和MySQL 14.14 DISTRIB 40年5月5日(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; 

在SQL腳本的情況下,以下應該工作與播放2.1及以上(請注意,我沒有測試過):

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;