select - 触发器在表上触发,但表上的选择返回 null。如何创建代码以访问触发触发器的行?
问题描述
触发器在表上触发,但表上的选择返回 null。如何创建代码以访问触发触发器的行?
我在触发器中有以下内容:
begin
dws_edi_api.init_edi_message(message_id,order_no',supplier_no');
end;
这会在更新表 out_message_tab 中的 row_state 列时触发。事件触发正常,但是在过程 dws_edi_api.init_edi_message_line 中我从 out_message_tab 中选择 c08,其中 message_id = message_id_ (来自触发器的变量)。它返回空值。我认为更改尚未提交。我尝试在我的代码中添加一个提交作为第一行以强制提交更改,但这没有帮助。我尝试添加一个 dbms_lock.sleep(!0) 但这也无济于事。我将代码添加到“显示一些代码框”中的过程中
procedure init_edi_message_line(message_id in number) is
pragma autonomous_transaction;
message_id_ number;
order_no_ varchar2(20);
supplier_no_ varchar2(20);
c08_ varchar2(200);
cursor c1 is
select c08
from jdifs.out_message_line_tab
where message_id = message_id_
and name = 'HEADER';
begin
-- dbms_lock.sleep(10);
message_id_ := message_id;
open c1;
loop
fetch c1
into c08_;
exit when c08_ is not null;
insert into jdifs.jdws_temp_line_tab
values
(message_id_, '2', c08_, '4');
commit;
END LOOP;
close c1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- Do something
null;
WHEN OTHERS THEN
null;
end init_edi_message_line;
编辑:
嗨,不,不幸的是,这并没有解决问题,我将再次尝试尽可能详尽地解释。我在表上有一个名为 out_message_line_tab 的触发器。在该表中创建一行时,它包含大量列。
我感兴趣的是 message_id(序列号)、order_no (P123456)、supplier_no(11242)、linenumber(1)、part_no (F1524)。
当触发器触发时,需要从该表中获取数据(在这种情况下,“连接到该表”的表是 out_message_tab。
所以触发器在 out_message_line_tab 上,但是将触发器中的值发送到过程是不够的,因为我还需要其他表中的一些数据。out_message_tab 和 out_message_line_tab 表之间的主键是 message_id
所以我的问题是如何从 out_message_tab 中进行选择,其中 message_id = message_id(来自 out_message_line_tab 的主键
当我这样做时,它只是说找不到数据。我认为它是因为它还没有被提交。
我希望这更清楚。
解决方案
您的过程init_edi_message_line()
是使用定义的pragma autonomous_transaction
。这意味着它在一个完全独立的会话中执行。因此,它无法在触发触发器的会话中看到任何未提交的数据。
如果您想init_edi_message_line()
处理来自该会话的数据,您的触发器需要将所有内容作为参数传递给该过程。但是,目前尚不清楚您在做什么 - 是out_message_line_tab
拥有触发器的表吗?- 所以我不能保证你很容易做出必要的改变。
推荐阅读
- javascript - 在shopify中使用嵌入式应用程序获取商店名称/ URL(应用程序是iFramed)
- plot - 用 gfortran 编译 plplot
- .htaccess - 如何使用 Htaccess 从 URL 中删除连续重复的单词?
- excel - 如何在 LINK 字段中调整图形对象的大小?
- php - 组合动态数组
- sql - 选择 In with invalid field
- android - 在 Android 上禁用对 USB 存储的访问
- c++ - SFML 游戏中的逻辑错误,如何修复渲染机制?
- r - 在 R 中保留最近的重复行
- rest - 使用 Express.js 的路由器级中间件订单