oracle触发器中需要通过字段来进行判断
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle触发器中需要通过字段来进行判断相关的知识,希望对你有一定的参考价值。
比如建立一个触发器,当A表中的B字段数据是'C'的时候,进行后面的PL/SQL语句,我用
if exists (select............)会报错 function or pseudo-column 'EXISTS' may be used inside a SQL statement only
有没有解决方法或者更好的判断语句
create or replace trigger "TRIG_TEST_A"
before insert on "A"
for each row
begin
if inserting then
if :NEW."BM" = 'C' then --如果插入的A记录,BM字段等于C,则写入A_BAK
insert into A_BAK
(BM, TEACHERS, ID)
values
(:NEW."BM", :NEW."TEACHERS", :NEW."ID");
end if;
end if;
end;
具体需求,根据触发器的语法进行调整
追问if inserting
....
end if
这个判断语句是做什么的
INSERTING:当触发事件是INSERT时,取值为TRUE,否则为FALSE。
本回答被提问者采纳 参考技术B 触发器的语法CREATE [OR REPLACE] TRIGGER trigger_name
BEFORE | AFTER
INSERT | DELETE | UPDATE [OF column [, column …]]
[OR INSERT | DELETE | UPDATE [OF column [, column …]]...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING OLD [AS] old | NEW [AS] new| PARENT as parent]
[FOR EACH ROW ]
[WHEN condition]
update后面可以跟 of column,column..... on tablename
把需要触发的字段写上,不触发的就别写了
oracle触发器记录字段变更
记录变更字段名和原始值…现在值…修改用户…修改时间等基础信息…我知道要用到表级和行级和包…但是不会写…求高人指点…
原来回答过这类问题。其实最直接的办法就是判断每列的old值和new值进行比较,不同的则插入记录表中;但是这样很麻烦,需要做很多判断,如果你的列很多的话,会有很多判断,所以比较繁琐。
另一种思路是这样,更新的记录有old值和new值,两条记录,对这两条记录进行操作,比如:
tab1的表为:id col1 col2 col3 col4 col5
1 B A I D U
更新了tab1的col2字段变为:
id col1 col2 col3 col4 col5
1 B HELLO I D U
产生了old和new两条记录,目的是找出值不同的列,跟原表的形式来找的话就需要几个判断。如果我们改变原表的形式的话,可操作性会更强一些,做这些改变。
select decode(col1,'H','col1') t1,'H' t2 from tab1 where id=1
union all
select decode(col2,'E','col2') t1,'E' t2 from tab1 where id=1
union all
select decode(col3,'L','col3') t1,'L' t2 from tab1 where id=1
union all
select decode(col4,'L','col4') t1,'L' t2 from tab1 where id=1
union all
select decode(col5,'O','col5') t1,'0' t2 from tab1 where id=1;
结构变为:
T1 T2
col1 H
col2 E
col3 L
col4 L
col5 0
这样的话old记录和new记录就各产生一份这种类型的数据集,这是就可以通过select来判断改变的列,存到触发器定义的变量中。
select tab1.T1,tab1.T2 into v_col,v_val from old_record tab1,new_record tab2 where tab1.T1=tab2.T1 and tab1.T2<>tab2.T2
然后插入到记录表中
insert into 记录表 values(v_col,v_val,sysdate); 参考技术A 你应该把表结构列出来,我这里给你提供个思路
现在假设有个表A :
create table a (id number,name varchar2(20));
有个B表去跟踪表A的变化:
create table b (
operat varchar2(10), --做的什么操作,可能的的有删除、插入、修改
col varchar2(10), --修改的列名
orig varchar2(50), --原始值,插入时为空
curr varchar2(50), --现在值,删除时为空
who varchar2(30), --修改用户
when date --修改时间
);
create or replace trigger tri_a_af_idu
after insert or delete or update on a
for each row --行级触发器
begin
if inserting then --如果插入,表A有几个字段就在表B记几行
insert into b values ('insert','id', '',to_char(:new.id),user,sysdate);
insert into b values ('insert','name','',:new.name,user,sysdate);
end if;
if deleting then --删除时新值是空
insert into b values ('delete','id',to_char(:old.id), '',user,sysdate);
insert into b values ('delete','name',:old.name,'',user,sysdate);
end if;
if updating then --更新哪个字段就记录哪个
if :new.id != :old.id then
insert into b values ('update','id',to_char(:old.id),to_char(:new.id),user,sysdate);
end if;
if :new.name != :old.name then
insert into b values ('update','id', :old.name,:new.name,user,sysdate);
end if;
end if;
end;
/
--测试DML操作
insert into a values (1,'111');
insert into a values (2,'222');
update a set id=3,name='333' where id=1;
delete a where id=3;
select * from a;
select * from b;
以上是关于oracle触发器中需要通过字段来进行判断的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE PL/SQL BEFORE UPDATE触发器,判断要update的字段是不是符合null or not null规则, 如果符合update.