MYSQL触发器错误(很多功能)

时间:2016-01-20 11:39:43

标签: mysql database function triggers declare

我似乎无法在我的代码中发现任何触发错误。 (我通常使用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工作台上做它我应该使用
SET变量
而不是直接
变量:=

期望的结果是外汇:T201600001
// T for transaction,2016我从dateformat得到它,其余的是从数据库中选择最大的数据
它是一个用于生产计划的软件,所以我正在制作交易代码

2 个答案:

答案 0 :(得分:0)

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

$config['global_xss_filtering'] = TRUE;

答案 1 :(得分:0)

NVL,是为你构建的函数吗?MySQL中不存在Oracle NVL函数(在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的answer进行简化:

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