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 楼主方法没有错,行级别前可以访问变异表,等等,看哪里出了错
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;
读或修改触发语句的任何变异表,其中包括触发表本身。
读或修改触发表的约束表中的主关键字,唯一关键字和外部关键字列。除此之外的其他列可以修改。上述限制适用于所有的行级触发器你可以在DECLARE后加
declare
pragma autonomous_transaction; 试试 但这样可能不安全
----------
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
楼主方法没有错,行级别前可以访问变异表,等等,看哪里出了错
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;
beckhambobo(beckham) 提的错误确实是那么回事儿.