MySQL触发器/过程不起作用

时间:2011-07-08 10:18:39

标签: mysql

我有一个触发器和程序,应该生成发票号。

数字示例(格式:类型/数字/月/年):

VAT/5/05/2011
VAT/6/05/2011
VAT/7/06/2011

使用year = YEAR(CURDATE())插入发票时,只应增加整数。

但是,在插入新年发票时(1月1日),它应该生成新的发票号,而我的系统的这部分不起作用。

程序:

CREATE PROCEDURE  generate_vat_number(out InvoiceNumber VARCHAR(50))
BEGIN
    SELECT
        CONCAT(
            SPLIT_STR(Number, '/', 1),
            '/',
            COUNT(Number) + 1,
            '/',
            SPLIT_STR(Number, '/', 3),
            '/',
            YEAR(CURDATE())
        )
        INTO InvoiceNumber
    FROM Invoices
    WHERE
        SPLIT_STR(Number, '/', 4) = YEAR(CURDATE())
    LIMIT 1;
END$$

触发器:

CREATE TRIGGER add_invoice_number BEFORE INSERT ON Invoices
FOR EACH ROW BEGIN
    CALL generate_vat_number(@out);
    IF @out = NULL THEN
        SET NEW.Number = CONCAT(SPLIT_STR(NEW.Number, '/', 1), '/', '1', '/', SPLIT_STR(NEW.Number, '/', 3), '/', YEAR(CURDATE()));
    ELSE
        SET NEW.Number =  @out;
    END IF;
END$$

用于拆分字符串的函数:

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

当我尝试创建新发票时,我收到错误,说“数字”字段不能为空,这是真的。我正在改变我的操作系统年份以模拟年份变化。据此,我认为我的触发器无法正常工作。但是,我不知道为什么。

1 个答案:

答案 0 :(得分:0)

我只能在触发器中看到一个问题,请尝试使用@out IS NULL代替@out = NULL

更正了触发器:

CREATE TRIGGER add_invoice_number BEFORE INSERT ON Invoices
FOR EACH ROW BEGIN
    CALL generate_vat_number(@out);
    IF @out IS NULL THEN
        SET NEW.Number = CONCAT(SPLIT_STR(NEW.Number, '/', 1), '/', '1', '/', SPLIT_STR(NEW.Number, '/', 3), '/', YEAR(CURDATE()));
    ELSE
        SET NEW.Number =  @out;
    END IF;
END$$

请告诉我们这是否适合您。