【问题标题】:MySQL delimiter statement errorMySQL分隔符语句错误
【发布时间】:2014-09-01 10:44:15
【问题描述】:

我正在尝试在 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 中运行它时,它工作正常,但是当 play 2 自动运行它时(在一个名为 2.sql 的文件中)我收到以下错误:

您的 SQL 语法有错误;在尝试运行这个 SQL 脚本:

我在互联网上读到分隔符语句仅适用于特定的 gui,而不是每次。真的吗 ?为什么 ?由于需要分隔符语句,如何解决?

感谢您的帮助。

【问题讨论】:

  • 您不需要第二个分隔符 DROP TRIGGER IF EXISTS invoice_line_insert $$$ 删除它已经在顶部。
  • @AbhikChakraborty 谢谢,但这并没有解决问题。
  • 在第一条语句DROP TRIGGER IF EXISTS invoice_line_insert ;之后添加;
  • @AbhikChakraborty 也不起作用...继续努力,我们最终会找到解决方案的!

标签: mysql playframework


【解决方案1】:

这似乎与Play framework 2.0 evolutions and create trigger 重复 (请注意,在我看来,更好的答案是 Roger 在 2013 年 5 月 24 日发布的答案,即上面的链接)

进化脚本文本中不能使用“分隔符”;我似乎找不到任何文件说明为什么会这样。但也许这与“分隔符”不是 SQL 语句而是 SQL 属性有关。

不过Evolutions section of Play 2 docs里有解决办法:

Play 将您的 .sql 文件拆分为一系列以分号分隔的语句,然后对数据库逐个执行它们。因此,如果您需要在语句中使用分号,请输入 ;; 将其转义。代替 ;。例如,INSERT INTO punctuation(name, character) VALUES ('semicolon', ';;');.

所以在你的情况下,

  1. 删除“分隔符”属性,然后
  2. 使用“;;”代替 ”;”为您的inner SQL 语句,以防止 Play 2 解析器单独执行这些内部 SQL 语句。

这是我在 Play 2.3 和 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;

对于您的 SQL 脚本,以下内容应适用于 Play 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;

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 2017-12-19
    • 2010-11-19
    • 1970-01-01
    • 2010-11-22
    • 2021-09-23
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    相关资源
    最近更新 更多