CREATE OR REPLACE TRIGGER tr_reg_cou
AFTER 
INSERT 
on  testa 
FOR EACH ROW
--when (new.cid in (6,7,8))
BEGIN
if exists(select 1 from testa where cid =:new.cid)
BEGIN
insert into testb (bid,nameb,xbb) values(:new.cid,:new.name,:new.xb);
commit;
end;
end if;
END;
我写了这个触发器,结果报错
Compilation errors for TRIGGER GISAP.TR_REG_COU
Error: PLS-00103: 出现符号 "BEGIN"在需要下列之一时:
        then and or
       符号 "then" 被替换为 "BEGIN" 后继续。
Line: 9
Text: BEGIN

我参考的例子写法是:http://bbs.csdn.net/topics/300082250
希望大神帮忙看下,小弟万分感谢!其实小弟的需求是这样的:
在A表中每次插入一条数据,去判断下新插入的那条数据的某个字段的值,就比如CID,是否在另一个表中出现过,如果有,然后再进行触发!
如果大神能帮忙想到另外更好的办法,小弟可以加分,万分感激!TRIGGER  if exists

解决方案 »

  1.   

    触发器 语法错误,IF 需要THEN 匹配成对的,少了个 THEN
    CREATE OR REPLACE TRIGGER tr_reg_cou
     AFTER 
     INSERT 
     on  testa 
     FOR EACH ROW
     --when (new.cid in (6,7,8))
     BEGIN
     if exists(select 1 from testa where cid =:new.cid) then
     BEGIN
     insert into testb (bid,nameb,xbb) values(:new.cid,:new.name,:new.xb);
     commit;
     end;
     end if;
     END;
      

  2.   


    CREATE OR REPLACE TRIGGER tr_reg_cou
     AFTER INSERT ON testa FOR EACH ROW
    DECLARE
      v_exist_count INTEGER := 0;
    BEGIN
      SELECT COUNT(0) INTO v_exist_count
        FROM testa 
       WHERE cid =:new.cid;
       
      IF v_exist_count > 0 THEN
        insert into testb (bid,nameb,xbb) values(:new.cid,:new.name,:new.xb);
        COMMIT;
      END IF;
    END tr_reg_cou;
      

  3.   

    CREATE OR REPLACE TRIGGER tr_reg_cou
     AFTER INSERT ON testa FOR EACH ROW
    DECLARE
      v_exist_count INTEGER := 0;
    BEGIN
      SELECT COUNT(0) INTO v_exist_count
        FROM testa 
       WHERE cid =:new.cid;
        
      IF v_exist_count > 0 THEN
        insert into testb (bid,nameb,xbb) values(:new.cid,:new.name,:new.xb);
        COMMIT;--把这个commit去掉就可以了。触发器中不能使用commit
      END IF;
    END tr_reg_cou;