Триггер срабатывает на столе, но выборка на таблице возвращает ноль.Как я могу создать код, чтобы иметь возможность доступа к строке, которая сработала триггер? - PullRequest
0 голосов
/ 24 июня 2019

Триггер срабатывает на столе, но выборка на таблице возвращает ноль. Как я могу создать код для доступа к строке, которая сработала триггером?

У меня в триггере следующее:

begin
  dws_edi_api.init_edi_message(message_id,order_no',supplier_no');
end; 

Это срабатывает при обновлении столбца row_state в таблице out_message_tab Событие срабатывает нормально, но когда в процедуре dws_edi_api.init_edi_message_line я делаю выбор c08 из out_message_tab, где 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

Когда я это делаю, он просто говорит, что данные не найдены. Я предполагаю это, потому что это еще не было передано.

Надеюсь, это понятнее.

1 Ответ

0 голосов
/ 24 июня 2019

Ваша процедура init_edi_message_line() определяется с помощью pragma autonomous_transaction.Это означает, что он выполняет в совершенно отдельный сеанс .Следовательно, он не может видеть никаких незафиксированных данных в сеансе, который запустил триггер.

Если вы хотите, чтобы init_edi_message_line() обрабатывал данные этого сеанса, ваши триггеры должны передать в процедуру все в качестве аргумента.Однако не совсем понятно, что вы делаете - это out_message_line_tab таблица, которой принадлежит триггер?- поэтому я не могу гарантировать, что вам будет легко внести необходимые изменения.

...