У меня есть пакет планирования, который вызывает процедуры и добавляет их в таблицу журнала событий в зависимости от дня месяца. (Лучший способ сделать это, вероятно, отдельное обсуждение.) Я хотел бы запросить пакет и вернуть день месяца и имя процедуры.
Я пытаюсь использовать некоторые функции 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