2014-08-30 5 views
-1

Я новичок в SQL. Я получаю сообщение об ошибке следующего триггера. Пожалуйста, помогитеMYSQL - Trigger

delimiter $$ 
create trigger cheque_update_trigger 
after insert on cheque_details 
for each row begin 
declare banktype text; declare branchrefno int ; 
select branch_ref_no into branchrefno from customer_account where acct_no = New.acct_no; 
select type into banktype from branch_table where branch_ref_no = branchrefno; 
if (type = 'ab') then 
insert into ab_cheque_register values (New.cheque_no, branchrefno, New.fbank_ref_no, New.amount); 
else if (type = 'nab') then 
insert into nab_cheque_register values(New.cheque_no, branchrefno); 
insert into osb_cheque_register values(New.cheque_no, branchrefno); else 
insert into osb_cheque_register values(New.cheque_no, branchrefno);> end if; 
end if; 
end$$ 
delimiter; 
+0

Если вы разделяете ошибку, было бы проще, чтобы помочь ... – Mureinik

+2

Пожалуйста, уточните вопрос с более подробной информацией. В другом случае это будет отмечено как низкое качество –

+0

** «Я получаю сообщение об ошибке» ** не является достаточным описанием проблемы. Сообщение об ошибке MySQL содержит * details *, которые описывают фактическую проблему, а не только туманную «ошибку». У вас есть * вопрос *, который вы хотели спросить? – spencer7593

ответ

1

Там в поддельной больше, чем символ (символ >) на линии с последней вставкой. Вероятно, это приведет к ошибке.

Также, на этой последней строке, поставьте промежуток DELIMITER и точка с запятой. (Мое личное предпочтение, чтобы иметь DELIMITER заявление предшествовало и за которым следует пустая строка.)


Примечание: Обычно, когда MySQL генерирует ошибку синтаксиса, то сообщение об ошибке обычно включает в себя указание о том, где MySQL считает проблему является. Это может помочь нам сузить место, где находится реальная проблема; но нам нужно фактическое сообщение об ошибке.


Там же ссылка на необъявленную переменную type в формулировках IF, что также приведет к ошибке.

Имена переменных выглядят одинаковыми с именами столбцов. Это разрешено, но когда есть столкновение (когда ссылка может быть в любом случае), важно отметить, что в MySQL приоритет присваивается имени переменной. Обычно мы избегаем этого: 1) сопоставляя ссылки столбцов с псевдонимом таблицы и 2) называем переменные таким образом, чтобы они не вызывали столкновений.

Основываясь на определении триггера О.П., я бы рекомендовал что-то вроде этого:

DELIMITER $$ 

CREATE TRIGGER cheque_update_trigger 
AFTER INSERT ON cheque_details 
FOR EACH ROW 
BEGIN 
    DECLARE v_banktype TEXT; 
    DECLARE v_branchrefno INT; 

    SELECT a.branch_ref_no 
    INTO v_branchrefno 
    FROM customer_account a 
    WHERE a.acct_no = NEW.acct_no 
    LIMIT 1; 

    SELECT b.type 
    INTO v_banktype 
    FROM branch_table b 
    WHERE b.branch_ref_no = v_branchrefno 
    LIMIT 1; 

    IF (v_banktype = 'ab') THEN 
    INSERT INTO ab_cheque_register (cheque_no, branch_ref_no, fbank_ref_no, amount) 
    VALUES (NEW.cheque_no, v_branchrefno, NEW.fbank_ref_no, NEW.amount); 
    ELSE 
    IF (v_banktype = 'nab') THEN 
     INSERT INTO nab_cheque_register (cheque_no, branch_ref_no) 
     VALUES (NEW.cheque_no, v_branchrefno); 
    END IF; 
    INSERT INTO osb_cheque_register (cheque_no, branch_ref_no) 
    VALUES (NEW.cheque_no, v_branchrefno); 
    END IF; 
END$$ 

DELIMITER ; 

Этот стиль форматирования делает НАМНОГО легче на бедной душе, которая должна читать и расшифровывать определение триггера.

(Is «banktype» на самом деле определяется как TEXT тип данных? Кажется, гораздо более вероятно, эта колонка будет определяться как VARCHAR, CHAR или ENUM.)

+0

Спасибо тонне :) Это помогло. Извините abt tht> раньше, это была моя ошибка, пытаясь преобразовать код как blockquote..new в stackoverflow! И да, форматирование ... довольно новичок: D Спасибо :) – WizzyVid