Хранимая процедура запускает logminer в одном и том же сеансе при каждом запуске

Я создал хранимую процедуру Oracle для извлечения данных из logminer на основе идентификатора строки транзакции и метки времени. процедура должна попытаться выбрать из logminer, и если это не удается, поскольку logminer запускается в этом сеансе, он должен запустить его и выбрать данные. Дело в том, что каждый раз, когда процедура запускает логминер в одном и том же сеансе

    create or replace PROCEDURE TRACK_TRACK (
CDC_TIMESTAMP IN VARCHAR2
,CDC_ROW_ID IN VARCHAR2
,SESSION_NUMBER OUT VARCHAR2
,SERIAL_NUMBER OUT VARCHAR2
,OS_USERNAME OUT VARCHAR2
,MACHINE_NAME OUT VARCHAR2
)
AS
V_LOG_NAME VARCHAR2 (256);
V_CDC_TIME DATE;
V_ROW_ID VARCHAR2 (18);
V_CDC_TIMESTAMP timestamp := to_timestamp (CDC_TIMESTAMP,'YYYYMMDDHH24MISSFF9');

BEGIN
SELECT session#,SERIAL#,'2',MACHINE_NAME,ROW_ID INTO SESSION_NUMBER,SERIAL_NUMBER,OS_USERNAME,MACHINE_NAME,V_ROW_ID FROM V$LOGMNR_CONTENTS 
Where ROW_ID=CDC_ROW_ID and TIMESTAMP=V_CDC_TIMESTAMP;
  EXCEPTION
  WHEN others
  THEN
        BEGIN
DBMS_LOGMNR.START_LOGMNR (STARTTIME=> SYSDATE-1,ENDTIME=>SYSDATE, OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG 
                                                                                            + DBMS_LOGMNR.CONTINUOUS_MINE);
                                             
                                              
SELECT session#,SERIAL#,'1',MACHINE_NAME,ROW_ID INTO SESSION_NUMBER,SERIAL_NUMBER,OS_USERNAME,MACHINE_NAME,V_ROW_ID FROM V$LOGMNR_CONTENTS 
Where ROW_ID=CDC_ROW_ID and TIMESTAMP=V_CDC_TIMESTAMP;END;
  
    
END TRACK_TRACK;

как это контролировать, чтобы логмайнер не запускался каждый раз?

1 ответ

ИСКЛЮЧЕНИЕ КОГДА другие

Попробуйте заменить его исключением ORA-1306 и протестируйте несколько раз, так как это, вероятно, вызывает другие внутренние ошибки:

CREATE OR REPLACE PROCEDURE TRACK_TRACK (
    CDC_TIMESTAMP IN VARCHAR2
   ,CDC_ROW_ID IN VARCHAR2
   ,SESSION_NUMBER OUT VARCHAR2
   ,SERIAL_NUMBER OUT VARCHAR2
   ,OS_USERNAME OUT VARCHAR2
   ,MACHINE_NAME OUT VARCHAR2
)
AS
--   V_LOG_NAME VARCHAR2 (256);
--   V_CDC_TIME DATE;
   V_ROW_ID VARCHAR2 (18);
   V_CDC_TIMESTAMP timestamp := to_timestamp (CDC_TIMESTAMP,'YYYYMMDDHH24MISSFF9');

   E_LOGNR_START exception;
   pragma exception_init(E_LOGNR_START, -1306);

   cursor cr is
      SELECT session#,SERIAL#,'2',MACHINE_NAME,ROW_ID
      FROM V$LOGMNR_CONTENTS
      Where ROW_ID=CDC_ROW_ID
        and TIMESTAMP=V_CDC_TIMESTAMP;

   procedure p is
   begin
      open cr;
      fetch cr INTO SESSION_NUMBER,SERIAL_NUMBER,OS_USERNAME,MACHINE_NAME,V_ROW_ID;
      close cr;
   exception when others then
      close cr;
      raise;
   end p;
BEGIN
   p();
EXCEPTION
   WHEN E_LOGNR_START THEN
       BEGIN
           DBMS_LOGMNR.START_LOGMNR (
              STARTTIME => SYSDATE-1,
              ENDTIME   => SYSDATE,
              OPTIONS   => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE
           );
           p();
       END;
END TRACK_TRACK;
/
Другие вопросы по тегам