MYSQL触发错误(很多功能)

MYSQL trigger error (lots of function)

我似乎无法在我的代码中发现任何触发触发器的错误。 (我通常使用 oracle 进行编码,但我在这个项目中转换为我的 sql,检查了所有函数并转换那些在 mysql 中不可用的函数)

这是代码:

CREATE TRIGGER `transaction_before_insert` BEFORE INSERT ON `transaction` FOR EACH ROW BEGIN
   DECLARE TEMPKODE VARCHAR(12);
   DECLARE TEMP VARCHAR(5);
   TEMP:= CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
   SELECT CONCAT(TEMP, LPAD(NVL(MAX(CAST(SUBSTR(TRANSACTION_ID,5,5) AS UNSIGNED))+1,1),5,0)) 
   FROM TRANSACTION INTO TEMPKODE
   WHERE SUBSTR(TRANSACTION_ID,1,4) = TEMP;
   NEW.TRANSACTION_ID := TEMPKODE;
 END

编辑 1:

我是从 heidisql 编码的,如果有任何代码差异,因为我听说如果我在 mysql 工作台上进行编码,我应该使用
设置变量
而不是直接
变量 :=

期望的结果是外汇:T201600001
//T代表交易,2016年我从dateformat中获取,剩下的就是从数据库中选择最大的数据
这是一个生产计划软件,所以我正在制作交易代码

您确实不需要此操作的临时变量(在 Oracle 或 MySQL 中)。我认为以下是相同的逻辑:

BEGIN
    select new.transactionid := CONCAT('T', YEAR(now()),
                                       LPAD(COALESCE(MAX(SUBSTR(TRANSACTION_ID, 5, 5) + 1
                                                        ), 1
                                                    ), 5, 0)
    from transaction t
    where TRANSACTION_ID LIKE CONCAT(YEAR(now()), '%')
END;

NVL, is a function built for you?, Oracle NVL 函数在 MySQL 中不存在(在 MySQL 中找到它的等价物),参见 IFNULL.

DELIMITER $$

BEGIN
    DECLARE TEMPKODE VARCHAR(12);
    DECLARE TEMP VARCHAR(5) DEFAULT CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
    -- OR: SET TEMP := CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
    -- TEMP := CONCAT('T',DATE_FORMAT(NOW(),'%Y'));

    /*
    SELECT CONCAT(TEMP,LPAD(NVL(MAX(CAST(SUBSTR(TRANSACTION_ID,5,5) AS UNSIGNED))+1,1),5,0))
    FROM TRANSACTION INTO TEMPKODE
    WHERE SUBSTR(TRANSACTION_ID,1,4) = TEMP;
    */

    SELECT CONCAT(TEMP,LPAD(COALESCE(MAX(CAST(SUBSTR(TRANSACTION_ID,5,5) AS UNSIGNED))+1,1),5,0))
    FROM TRANSACTION
    WHERE SUBSTR(TRANSACTION_ID,1,4) = TEMP INTO TEMPKODE;

    -- NEW.TRANSACTION_ID := TEMPKODE;
    SET NEW.TRANSACTION_ID := TEMPKODE;
END$$

DELIMITER ;

更新

您可以使用@GordonLinoff 的 进行简化:

SET NEW.TRANSACTION_ID := CONCAT(...);