首页 > 解决方案 > 触发器在表上触发,但表上的选择返回 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 的主键

当我这样做时,它只是说找不到数据。我认为它是因为它还没有被提交。

我希望这更清楚。

标签: selectplsqltransactionsdatabase-trigger

解决方案


您的过程init_edi_message_line()是使用定义的pragma autonomous_transaction。这意味着它在一个完全独立的会话中执行。因此,它无法在触发触发器的会话中看到任何未提交的数据。

如果您想init_edi_message_line()处理来自该会话的数据,您的触发器需要将所有内容作为参数传递给该过程。但是,目前尚不清楚您在做什么 - 是out_message_line_tab拥有触发器的表吗?- 所以我不能保证你很容易做出必要的改变。


推荐阅读