【问题标题】:A trigger fires on a table, but the select on the table returns null. How can I create the code to be able to access the row that fired the trigger?触发器在表上触发,但表上的选择返回 null。如何创建代码以访问触发触发器的行?
【发布时间】:2019-06-25 04:12:52
【问题描述】:

触发器在表上触发,但表上的选择返回 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 的主键

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

我希望这更清楚。

【问题讨论】:

    标签: select plsql transactions database-trigger


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,是的,因为我尝试不使用它,但它没有工作。所以我添加了它并添加了睡眠,所以它会等待提交。是的 out_message_line_tab 是有触发器的表
    • 如果这不能解决您的问题 - 听起来好像不能 - 然后请编辑您的问题,准确解释您想要实现的目标,包括表结构、输入数据和预期输出。如果您提供您的业务规则,而不是要求我们从一些 sn-p 代码对它们进行逆向工程,这总是更容易。
    • 谢谢你,我添加了一些澄清(我希望):)
    猜你喜欢
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多