2014-08-30 104 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