Oracle 11g-想知道当前行信息,尤其是PK吗
我像下面那样扣动了扳机。Oracle 11g-想知道当前行信息,尤其是PK吗,oracle,oracle11g,triggers,sequence,procedure,Oracle,Oracle11g,Triggers,Sequence,Procedure,我像下面那样扣动了扳机。 test\u suc\u func始终返回varchar2“00” 我希望这个PLSQL能够执行以下内容 当数据插入一个TBL时,它调用一个函数 当它失败时,它会更新该列 问题是当我在exception语句中编写时,会更新一个TBL中的所有行 由于一个TBL的PK是序列,我可以用A_seq.currVal得到它,但正如您所看到的,不能在where语句中使用序列 问:如何引用触发器中的当前行数据,比如javascript中的this关键字 我尝试了:new和:old,但它
test\u suc\u func
始终返回varchar2“00”
我希望这个PLSQL能够执行以下内容
exception
语句中编写时,会更新一个TBL中的所有行
由于一个TBL的PK是序列,我可以用A_seq.currVal
得到它,但正如您所看到的,不能在where
语句中使用序列
问:如何引用触发器中的当前行数据,比如javascript中的this
关键字
我尝试了:new
和:old
,但它在sqldeveloper中弹出了一个奇怪的窗口。谢谢:D bb
==================================2015 09 18
我编辑了这篇文章,因为我出错了。一些
a_seq
s变为a_id
s.我相信有比这更好的方法。但我找到了一条弯路
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;
我在触发器中声明了一个临时变量。
并提到这一点。现在,当我失败时,我只更新当前行
对于这个问题,我仍然在寻找更有效、更聪明的答案。谢谢据我所知,您需要修改插入记录的列。
在这种情况下,触发器中不需要update语句。
您只需在插入前使用
为每行触发。
在这种情况下,您可以只为
: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;
您不能在触发器之后修改:中的新变量,并且在没有的情况下,无法访问每行的选项。此外,不能从为同一个表(表正在发生变化)上的每一行
触发器调用某个表上的DML(insert/update/delete)。不能在触发触发器的表上运行update
语句。你不需要它<代码>:new.created:=test_suc_func()代码>是您在应用程序中所需的全部内容trigger@a_horse_with_no_name这段代码是一个简单的版本。实际上,它将调用远程数据库中的函数。-我不明白你的第一句话。我提供的代码实际上是有效的。问题是它会更新所有行,因为我编写了where子句,比如a\u id=a\u id
。我想写的是类似于a_id=this.a_id
或a_id=a_seq.currVal
。无论如何,谢谢。在语句级触发器中没有“当前行”这样的东西,因为它是为语句而不是为每一行触发的。该语句可能影响了数百万行。我有几个问题,但不确定您为什么放弃行级触发器(并转到语句级),因为行级似乎是您想要的(因此您可以参考:new和:old)。尝试将“set define off”放在顶部,然后作为脚本运行,或者将触发器代码放在单独的编辑器窗口中,然后运行execute语句(而不是脚本)。或者,放入一个sql文件并在sqlplus(@myfile.sql)中运行。如果插入了多行,这将不起作用。我仍然不明白为什么不能(或不想)使用行级触发器并分配:new
值directly@a_horse_with_no_name我是PLSQL新手,但是否有一次插入几行的情况?我假设在insert语句中,目标一次只有一条记录。我将检查我是否可以在事件后使用行级触发器。但是,在我的情况下必须更新后插入。在这个项目中,首先插入MyDB表,然后调用返回响应代码的远程函数。在我从remote收到响应代码后,更新原始行(已插入)。解决此任务有两种方法:1)将_tbl.rowtype传递给函数,或者只传递内部所需的列列表(在这种情况下,不需要在函数中查询此行,因此可以在触发器之前使用)。然后使用:新的。触发器中的变量设置从函数传递的新值。(不要在触发器或函数中使用更新)2)从触发器运行作业,它将在提交insert后启动,然后函数需要更新此行。(但在这种情况下,在函数更新此行并在未定义这两列时提交结果之前,提交后会有间隙)
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;