Oracle 使用CASE语句插入值

Oracle 使用CASE语句插入值,oracle,plsql,Oracle,Plsql,我想将一些值放入表中,特别是由我使用的DML操作决定的值: -如果我插入一行,我需要把我正在做的一个插入到一个表,我用它来注册用户所做的所有操作 -如果我正在删除,请删除 -当我更新的时候也是一样 我的代码如下,用于在我的表中插入这些行: 但当我在触发器中使用它并编译它时,它会显示一个ORA-00084错误,并忽略触发器前面的一些行。提前谢谢 我也尝试了解码,但它也显示了相同的错误。您可以尝试以下方法: ... l_op aud.op%type; begin ...

我想将一些值放入表中,特别是由我使用的DML操作决定的值: -如果我插入一行,我需要把我正在做的一个插入到一个表,我用它来注册用户所做的所有操作 -如果我正在删除,请删除 -当我更新的时候也是一样

我的代码如下,用于在我的表中插入这些行:

但当我在触发器中使用它并编译它时,它会显示一个ORA-00084错误,并忽略触发器前面的一些行。提前谢谢

我也尝试了解码,但它也显示了相同的错误。

您可以尝试以下方法:

   ...
   l_op aud.op%type;    
begin
  ...
  if INSERTING then
    l_op := 'INSERT';
  ...
  elsif UPDATING then
    l_op := 'UPDATE';
  ...
  end if;

  ...
  if l_op in ('INSERT', 'DELETE') 
     or l_op = 'UPDATE' 
        and (nvl(:old.fied1, 0) != nvl(:new.fied1, 0)
             or nvl(:old.fied2, 0) != nvl(:new.fied2, 0)
             ...
            )
  then 
    INSERT INTO AUD(usr, date, op, other_fields)
    values (USER, SYSDATE, l_op, :OLD.other_fields, :NEW.other_fields);
  end if;
  ...

谢谢你的回答,但我应用了它,它表明更新标识符是无效的,但它不能这样说,因为这是一个条件。@Ryuuko Matoi您不能在表达式中使用触发器谓词插入、更新、删除,只能在特殊情况下使用,例如IF insert THEN。。。如果结束;那太可悲了。如果我想在insert中使用它,它被放入触发器中,我怎么能使用这些谓词呢?还有其他选择吗?非常感谢,它很好用。但是如果我不想注册:new更改,除非:old已更改,那么在这种情况下我能做什么?@Ryuuko Matoi如果插入之外,您可以使用。我已经更新了我的答案。
   ...
   l_op aud.op%type;    
begin
  ...
  if INSERTING then
    l_op := 'INSERT';
  ...
  elsif UPDATING then
    l_op := 'UPDATE';
  ...
  end if;

  ...
  if l_op in ('INSERT', 'DELETE') 
     or l_op = 'UPDATE' 
        and (nvl(:old.fied1, 0) != nvl(:new.fied1, 0)
             or nvl(:old.fied2, 0) != nvl(:new.fied2, 0)
             ...
            )
  then 
    INSERT INTO AUD(usr, date, op, other_fields)
    values (USER, SYSDATE, l_op, :OLD.other_fields, :NEW.other_fields);
  end if;
  ...