2016-01-20 72 views
0

我似乎無法在我的代碼上發現任何錯誤來觸發。 (我通常代碼中使用甲骨文,但我轉換爲我在這個項目中的SQL,檢查了所有的功能和轉換那些不提供MySQL的話)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年我是從日期格式,其餘的是從數據庫中
它的生產計劃軟件選擇的最大數據所以我正在交易代碼

+0

向我們展示了整個觸發聲明,請。你可能已經搞砸了棘手的MySQL'SET DELIMITER'黑客。也請顯示你遇到的錯誤。 –

+0

哦對不起,因爲我認爲整個觸發器只是創建或替換觸發器等 –

+0

這裏是整個代碼CREATE TRIGGER'transaction_before_insert'在插入事務之前每個行開始 \t DECLARE TEMPKODE VARCHAR(12); \t DECLARE TEMP VARCHAR(5); TEMP:= CONCAT('T',DATE_FORMAT(NOW(),'%​​Y')); \t SELECT CONCAT(TEMP,LPAD(NVL(MAX(CAST(SUBSTR(TRANSACTION_ID,5,5)爲無符號))+ 1,1),5,0)) \t FROM TRANSACTION INTO TEMPKODE \t WHERE SUBSTR(TRANSACTION_ID ,1,4)= TEMP; \t NEW.TRANSACTION_ID:= TEMPKODE; END @ ollie-jones –

回答

0

NVL,是你建立了一個功能?甲骨文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 ; 

UPDATE

您可以@GordonLinoff的answer簡化:

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

所以我需要將我的nvl改成ifnull對嗎?我需要添加DELIMITER命令嗎?@wchiquito –

+0

@RobertWilliam:評估['IFNULL'](http:// dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_ifnull),並確定它是否符合你的要求。創建觸發器時使用'DELIMITER'。 – wchiquito

+0

我仍然有錯誤,但它接近底線哦,我刪除了分隔符,因爲它不被heidi支持,它在這行上WHERE SUBSTR(TRANSACTION_ID,1,4)= TEMP;據說在該行附近發生錯誤@wchiquito –

0

你真的不需要這個操作的臨時變量(在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; 
+0

哇,這是非常有效的,我不需要將substr transaction_id轉換爲整數,但?因爲它被保存爲varchar @GordonLinoff –

+0

無論如何,你的代碼出現錯誤@GordonLinoff「你的SQL語法有錯誤,請檢查相應於MySql服務器版本的手冊,以使用':= CONCAT('T' ,YEAR(NOW())BLABLABLA在第2行「 –