我有一个脚本/home/load_data.sh,我想从我的过程中运行,只有当我的 IF 语句不满足时:
create or replace
PROCEDURE RD_ODS_REFRESH_LOG
IS
BEGIN
FOR i IN
(
SELECT RESULT FROM USERS
WHERE trunc(COMPLETED_DATE) = trunc(SYSDATE -1)
)
LOOP
IF i.RESULT = 'FAIL'
THEN
EMAIL
(
'ANGELINA1984@aol.com',
'daily Refresh report',
'FAILED',
'Todays daily Refresh Failed.'
);
ELSE
SYS.DBMS_SCHEDULER.create_job
(
job_name => 'RD_ODS_REFRESH_LOG',
job_action => '/home/load_data.sh',
job_type => 'executable',
number_of_arguments => 0,
start_date => SYSDATE,
repeat_interval => 'FREQ=SECONDLY; INTERVAL=1',
enabled => FALSE,
auto_drop => FALSE,
comments => 'run load data shell script'
);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
(
name => 'RD_ODS_REFRESH_LOG',
attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_FULL
);
SYS.DBMS_SCHEDULER.enable
(
name => 'RD_ODS_REFRESH_LOG'
);
END IF;
END LOOP;
END RD_ODS_REFRESH_LOG;
我想知道如何将所有这些放在一起,以便当 IF 不满足时,它跳转到 ELSE 语句并执行上面的代码?
我可以使用 SCHEDULER 以外的其他东西吗?毕竟我想要的是能够在 ELSE 情况下运行我的/home/load_data.sh 脚本。
我用的是Oracle11g...
最佳答案
可能值得朝另一个方向走,更多地使用调度程序,尤其是调度程序链。
我这样说是因为你在这里展示的那种流程控制——如果失败则执行 X,否则执行 Y——编码起来很烦人,而对于调度程序链,你只需指定在特定步骤出现时要运行的下一步错误与否。
一旦您习惯了它,它就会非常轻松,而且非常灵活和可靠——我运行调度程序链来加载数据仓库,每天 24 小时每 60 秒执行一次加载和转换作业,持续了一年多,停止用于维护的链,在维护结束时重新启动它们,您所需要的只是一些监视和控制脚本。
关于linux - 在 oracle 过程中运行 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681510/