我觉得问题出在update的时候,cursor出错了,那么用什么办法能够解决呢...高人指点啊!困惑ing

解决方案 »

  1.   

    INSERT OR UPDATE on call_style_table FOR EACH ROW而你的 cursor  cur_1 又从 call_style_table 选择数据 这中写法oracle是不允许的
      

  2.   

    触发器体中的 SQL 语句不能进行下列操作:
          读或修改触发语句的任何变异表,其中包括触发表本身。
          读或修改触发表的约束表中的主关键字,唯一关键字和外部关键字列。除此之外的其他列可以修改。上述限制适用于所有的行级触发器你可以在DECLARE后加
       declare
       pragma autonomous_transaction;    试试   但这样可能不安全
      

  3.   

    SQL> select * from bb;ID
    ----------
    1create trigger bb_tri
    before insert on bb
    for each row
    declare
    cursor t_sor is
    select id from bb;
    begin
    for v_sor in t_sor loop
    if :new.id=v_sor.id then
    dbms_output.put_line('存在相同的id号');
    end if;
    end loop;
    end;
    /SQL> insert into bb values('1');1 row insertedSQL> select * from bb;ID
    ----------
    1
    1
    楼主方法没有错,行级别前可以访问变异表,等等,看哪里出了错
      

  4.   

    CREATE OR REPLACE TRIGGER call_style_trigger
    BEFORE INSERT OR UPDATE on call_style_table 
    FOR EACH ROW
    DECLARE
    vs_call_style char(8);
    vs_net_type char(1);
    m number(2); --计数器
    --n number(2);                      这个不用定义,程序可以完成
    cursor cur_1 is
    select distinct call_style_code,net_type 
    from call_style_table;
    BEGIN
    for v_cur in cur_1 loop
     if v_cur.net_type = :new.net_type then
       m := 0;
       for n in 1..8 loop
        if substr(:new.call_style_code,n,1) = substr(v_cur.call_style,n,1) or substr(:new.call_style_code,n,1) = '*' or substr(v_cur.call_style,n,1) = '*' then
         m := m+1;
        end if;
       end loop;
     if m = 8 then
      RAISE_APPLICATION_ERROR(-20001, '发生冲突,表中已存在与当前增加记录匹配的通话类型,其值为'||v_cur.call_style);
     end if;
     end if;
    end loop;
    END;
    /有几处错语
    错误一:
    n不用定义
    错误二:
    fetch ...同时出现循环两次
    错误三:
    触发器体内不能出现commit;
      

  5.   

    谢谢大家,该问题已经解决了. 用了一个包和两个触发器.真是不容易.
     beckhambobo(beckham) 提的错误确实是那么回事儿.