Извлечь несколько строк из пакета DDL - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть пакет планирования, который вызывает процедуры и добавляет их в таблицу журнала событий в зависимости от дня месяца. (Лучший способ сделать это, вероятно, отдельное обсуждение.) Я хотел бы запросить пакет и вернуть день месяца и имя процедуры.

Я пытаюсь использовать некоторые функции REGEXP после извлечения DDL из пакета, но не могу понять.

SELECT REGEXP...something AS DayOfMonth
     , REGEXP...something AS ProcName
  FROM (
        SELECT DBMS_METADATA.GET_DDL(d.OBJECT_TYPE, d.OBJECT_NAME, 'ME') AS DDL_STR
          FROM DBA_OBJECTS d
         WHERE d.OWNER = 'ME'
           AND d.OBJECT_TYPE = 'PACKAGE'
           AND d.OBJECT_NAME = 'TST_SCHED_PKG'
       ) t
;

Подзапрос DBMS_METADATA.GET_DDL() возвращает CLOB из:


  CREATE OR REPLACE EDITIONABLE PACKAGE "ME"."TST_SCHED_PKG2" is

  type run_log_cursor_t is ref cursor return run_log%rowtype;

  procedure run_daily (ioc_run_log_cursor in out run_log_cursor_t);


end TST_SCHED_PKG2;

CREATE OR REPLACE EDITIONABLE PACKAGE BODY "ME"."TST_SCHED_PKG2" is

  procedure run_daily (ioc_run_log_cursor in out run_log_cursor_t) is

    d_run_daily_start_time date;
    d_start date;
    d_end   date;

  begin --run_daily

    d_run_daily_start_time := sysdate;

    --*************************** MONTHLY PROCEDURES HERE ******************************
    case extract (day from d_run_daily_start_time)

      when 1 then

        ABC.PROC1;
             d_end := sysdate;    XYZ.add_event_log('ABC.PROC1',d_start, d_end);    d_start := sysdate;

        ABC.PROC2;
             d_end := sysdate;    XYZ.add_event_log('ABC.PROC2',d_start, d_end);    d_start := sysdate;

      when 2 then

        DEF.PROC3;
             d_end := sysdate;    XYZ.add_event_log('DEF.PROC3',d_start, d_end);    d_start := sysdate;

        GHI.PROC4;
             d_end := sysdate;    XYZ.add_event_log('GHI.PROC4',d_start, d_end);    d_start := sysdate;

      when 3 then

        XYZ.PKG1.PROC5(trunc(sysdate));
        d_end := sysdate;    XYZ.add_event_log('XYZ.PKG1.PROC5',d_start, d_end);    d_start := sysdate;

        XYZ.PKG2.PROC6(add_months(trunc(sysdate, 'mm'), -1));
        d_end := sysdate;    XYZ.add_event_log('XYZ.PKG2.PROC6',d_start, d_end);    d_start := sysdate;

  end; --run_daily

end TST_SCHED_PKG2;

Пример пакета:

create or replace package body TST_SCHED_PKG is

  procedure run_daily (ioc_run_log_cursor in out run_log_cursor_t) is

    d_run_daily_start_time date;
    d_start date;
    d_end   date;

  begin --run_daily

    d_run_daily_start_time := sysdate;

    --*************************** MONTHLY PROCEDURES HERE ******************************
    case extract (day from d_run_daily_start_time)

      when 1 then

        ABC.PROC1;
             d_end := sysdate;    XYZ.add_event_log('ABC.PROC1',d_start, d_end);    d_start := sysdate;

        ABC.PROC2;
             d_end := sysdate;    XYZ.add_event_log('ABC.PROC2',d_start, d_end);    d_start := sysdate;

      when 2 then

        DEF.PROC3;
             d_end := sysdate;    XYZ.add_event_log('DEF.PROC3',d_start, d_end);    d_start := sysdate;

        GHI.PROC4;
             d_end := sysdate;    XYZ.add_event_log('GHI.PROC4',d_start, d_end);    d_start := sysdate;

      when 3 then

        XYZ.PKG1.PROC5(trunc(sysdate));
        d_end := sysdate;    XYZ.add_event_log('XYZ.PKG1.PROC5',d_start, d_end);    d_start := sysdate;

        XYZ.PKG2.PROC6(add_months(trunc(sysdate, 'mm'), -1));
        d_end := sysdate;    XYZ.add_event_log('XYZ.PKG2.PROC6',d_start, d_end);    d_start := sysdate;

  end; --run_daily

end TST_SCHED_PKG;

Например, я хотел бы вернуть:

DayOfMonth ProcName
1          PROC1
1          PROC2
2          PROC3
2          PROC4
3          PKG1.PROC5
3          PKG2.PROC6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...