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
有没有解决方法或者更好的判断语句

参考技术A 插入A之前的触发示例:
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到mysql批量添加注释

oracle到mysql批量添加注释

oracle到mysql批量添加注释

判断:ORACLE中,用==NULL来判断列值是不是为空,

oracle数据库

ORACLE PL/SQL BEFORE UPDATE触发器,判断要update的字段是不是符合null or not null规则, 如果符合update.