日期:2014-05-16  浏览次数:20715 次

关于触发器的if exists的问题,求大神帮忙看下,在线等
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,是否在另一个表中出现过,如果有,然后再进行触发!
如果大神能帮忙想到另外更好的办法,小弟可以加分,万分感激!
------解决方案--------------------
触发器 语法错误,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;

------解决方案--------------------

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;