Oracle 11g - 想知道当前行信息,尤其是PK

Oracle 11g - Want to know current row information, especially PK

我制作了如下触发器。 test_suc_func 总是 return varchar2 "00".

create or replace procedure call_func (v_a_id  IN NUMBER)
is 
begin 
update A_TBL set created = test_suc_func() where a_id = v_a_id;
end;


CREATE OR REPLACE TRIGGER a_trigger
  AFTER
    INSERT ON A_TBL
  -- FOR EACH ROW    
BEGIN
  call_func(a_seq.currVal);
exception
  when others then 
  update A_TBL set rc='99'
  where a_id = a_id;  
END;

我希望这个 PLSQL 执行以下操作。

  1. 当数据插入A_TBL时,它调用一个函数。
  2. 失败时,它会更新该列。

问题是当我在 exception 语句中写入时,更新 A_TBL.

中的所有行

由于 A_TBL 的 PK 是序列,我可以用 a_seq.currVal 得到它,但正如你所见,不能在 where 语句中使用序列。

问。如何在触发器中引用当前行数据,如 javascript 中的 this 关键字?

我已经尝试了:new:old,但是它在sqldeveloper中弹出了一个奇怪的window。谢谢 :D bb

===================2015 09 18

我编辑了 post,因为我遇到了错误。 a_seq 中的一些更改为 a_id

我相信还有比这更好的方法。然而我却绕了个弯

CREATE OR REPLACE TRIGGER a_trigger
  AFTER
    INSERT ON A_TBL
  -- FOR EACH ROW    
DECLARE
  tmp_id number;
BEGIN
  select a_seq.currVal into tmp_id from dual;
  call_func(tmp_id);
exception
  when others then 
  update A_TBL set rc='99'
  where a_id = tmp_id;  
END;

我已经在触发器中声明了一个临时变量。 并参考那个。现在我失败时只更新当前行。

我仍在为这个问题寻找更有效、更聪明的答案。谢谢

据我了解,您需要修改插入记录的列。
对于这种情况,您不需要触发器中的更新语句。
您只需要 BEFORE INSERT 触发器和 FOR EACH ROW 选项。
在这种情况下,您可以为 :new.created:new.rc,它们将被插入到 createdrc 列。
像这样:

CREATE OR REPLACE TRIGGER a_trigger
  BEFORE
    INSERT ON A_TBL
    FOR EACH ROW    
BEGIN
  :new.created = test_suc_func();
exception
  when others then 
    :new.rc = '99';
END;

您无法修改 AFTER 触发器中的 :new 变量,并且在没有 FOR EACH ROW 选项的情况下无法访问它们。此外,您不能在同一 table 上从 FOR EACH ROW 触发器的某些 table 上调用 DML (insert/update/delete)(table 正在变异)。