2016-01-20 9 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 

EDIT 1:

я кодирование его от HeidiSQL, если есть какая-то разница коды, так как я слышал, если я это сделать на MySQL верстак я должен использовать
SET переменных
вместо непосредственно
переменные: =

желаемый результат форекс: T201600001
// T для сделки, 2016 я получил его от DateFormat, а остальное выбирает самые большие данные из базы данных
это программное обеспечение для планирования производства поэтому я делаю код транзакции

+0

Покажите нам всю декларацию триггера, пожалуйста. Возможно, вы перепутали сложный взлом MySQL 'SET DELIMITER'. Также, пожалуйста, покажите ошибку, которую вы получаете. –

+0

О, извините, так как я думаю, что весь триггер только создает или заменяет триггер и т. Д. –

+0

вот весь код CREATE TRIGGER 'transaction_before_insert' ДО INSERT ON' transaction' ДЛЯ КАЖДОГО ROW BEGIN \t DECLARE TEMPKODE VARCHAR (12); \t DECLARE TEMP VARCHAR (5); \t TEMP: = CONCAT ('T', DATE_FORMAT (NOW(), '% Y')); \t ВЫБОР CONCAT (ТЕМП, LPAD (NVL (МАКС (CAST (SUBSTR (TRANSACTION_ID, 5,5) как беззнаковое)) + 1,1), 5,0)) \t ОТ транзакции на TEMPKODE \t ГДЕ SUBSTR (TRANSACTION_ID , 1,4) = TEMP; \t NEW.TRANSACTION_ID: = TEMPKODE; END @ ollie-jones –

ответ

0

NVL, является встроенной функцией для вас ?, 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 ; 

UPDATE

Вы можете упростить с answer из @GordonLinoff:

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

, поэтому мне нужно изменить свой nvl на ifnull правильно? Мне нужно добавить команду DELIMITER? @wchiquito –

+0

@RobertWilliam: Evaluate [' IFNULL'] (http: // dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_ifnull) и определить, делает ли оно то, что вам нужно. 'DELIMITER' используется при создании триггера. – wchiquito

+0

У меня все еще есть ошибка, но он близок к нижней строке oh и я удаляю delimeter, так как он не поддерживается в 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

wow, что очень эффективно, мне не нужно выделять substr transaction_id как целое?так как он сохраняется как varchar @GordonLinoff –

+0

в любом случае у вас есть ошибка в вашем коде @GordonLinoff «у вас есть ошибка в вашем синтаксисе SQL, проверьте руководство, соответствующее вашей версии сервера MySql, для использования правильного синтаксиса рядом с:: = CONCAT ('T' , YEAR (NOW()) BLABLABLA в строке 2 « –