2014-08-30 198 views
-1

我是SQL新手。執行以下觸發器時出現錯誤。請幫助MYSQL - 觸發器

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 2014-08-30 14:40:37

+2

請更新問題與更多細節。其他方面,它會標記爲低質量 – 2014-08-30 14:46:33

+0

**「我得到一個錯誤」**不是對問題的充分描述。 MySQL錯誤消息包含*詳細信息*,描述實際問題,而不僅僅是一些模糊的「出現錯誤」。你有問題*你想問嗎? – spencer7593 2014-08-30 15:16:48

回答

1

有比與上插入該行符號字符(>)虛假更大。可能會導致錯誤。

另外,在最後一行,在DELIMITER和分號之間加一個空格。 (我個人的偏好是有DELIMITER聲明一個空行之前和之後。)


注:通常情況下,當MySQL拋出一個語法錯誤,該錯誤信息通常包括其中的MySQL認爲該問題的指示是。這可以幫助我們縮小實際問題的位置;但我們需要實際的錯誤信息。


還有一個未聲明的變量在IF語句type,這也將導致錯誤的引用。

變量的名稱看起來與列名相同。這是允許的,但是當發生衝突時(當引用可能是這兩者中的任何一個時),需要注意的是,在MySQL中,優先級賦予變量名稱。我們通常通過1)使用表別名限定列引用,以及2)以不會導致衝突的方式命名變量。

基礎上OP觸發器定義,我建議是這樣的:

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 ; 

格式的這種風格使得它對窮人的靈魂,具有讀取和理解觸發器定義MUCH容易。

如果您共享的錯誤它會更容易幫助(是「banktype」實際上定義爲TEXT數據類型?似乎更容易得多此列將被定義爲VARCHAR,CHAR或ENUM)

+0

謝謝噸ton :)這有幫助。對不起,在別的之前,這是我的錯誤,而試圖將代碼轉換爲blockquote..new到stackoverflow以及!而且是格式化...相當新手:D謝謝:) – WizzyVid 2014-08-30 15:17:14