Как зафиксировать только один запрос во время выполнения хранимой процедуры Oracle - PullRequest
0 голосов
/ 10 января 2019

Я использую SQL-разработчик. У меня есть хранимая процедура, которая выполняется долго. Мне нужно проследить, что происходит во время выполнения.

Я пытался с DBMS_output.put_line('trace');. Но он печатает после завершения хранимой процедуры. Также я не могу использовать DBMS_trace (может быть, я использую более старую версию).

Итак, я пришла в голову идея. Я хотел бы вставить в таблицу во время выполнения хранимой процедуры. Как я могу зафиксировать только этот запрос вставки в хранимой процедуре?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я вижу две возможности.

Либо вы пишете процедуру, которая вставляет сообщения журнала в таблицу. Объявите эту процедуру с PRAGMA AUTONOMOUS_TRANSACTION:

CREATE OR REPLACE PROCEDURE WriteLogMsg(LogMessage IN VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;      
BEGIN

   INSERT INTO T_LOG_ENTRIES (LOG_DATE, LOG_MESSAGE) 
   VALUES (CURRENT_TIMESTAMP, LogMessage);
   COMMIT;

END WriteLogMsg;

Или используйте пакет DBMS_APPLICATION_INFO:

PROCEDURE LONG_RUNNING_PROCEDURE IS
BEGIN

DBMS_APPLICATION_INFO.SET_MODULE('LONG_RUNNING_PROCEDURE', 'Starting');
...

DBMS_APPLICATION_INFO.SET_ACTION('Still working, please be patient'); 
...

DBMS_APPLICATION_INFO.SET_ACTION('Finished');

-- DBMS_APPLICATION_INFO.SET_MODULE(NULL, NULL); -> removes entries for MODULE and ACTION

END;

Во время выполнения процедуры вы можете запросить информацию с помощью

SELECT USERNAME, MODULE, ACTION
from V$SESSION
where USERNAME = ...;
0 голосов
/ 10 января 2019

В этом случае вы должны использовать автономные транзакции Pragma.

Создайте новую процедуру с Pragma Автономный.

PROCEDURE test_autonomous 
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
   insert ....
   commit;
END test_autonomous;

теперь вызовите эту процедуру в своем коде. это сделает ваш трюк. Вы можете использовать параметры, чтобы вставить некоторые данные, которые вы хотите вставить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...