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 执行以下操作。
- 当数据插入A_TBL时,它调用一个函数。
- 失败时,它会更新该列。
问题是当我在 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
,它们将被插入到 created
和 rc
列。
像这样:
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 正在变异)。
我制作了如下触发器。
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 执行以下操作。
- 当数据插入A_TBL时,它调用一个函数。
- 失败时,它会更新该列。
问题是当我在 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
,它们将被插入到 created
和 rc
列。
像这样:
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 正在变异)。