在oracle过程中运行shell脚本

时间:2013-07-16 16:01:43

标签: linux shell oracle11g job-scheduling

我有一个脚本/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 ......

1 个答案:

答案 0 :(得分:1)

可能值得向另一个方向发展并更多地使用调度程序,尤其是调度程序链。

我说这是因为你在这里显示的那种流量控制 - 如果失败则执行X,否则执行Y - 编码很烦人,并且使用调度程序链,只需指定下一步即可执行特定步骤是不是错误。

一旦你习惯它,它非常无痛,非常灵活和可靠 - 我运行调度链来加载数据仓库,每天24小时每60秒执行一次加载和转换工作一年,停止维护链,在维护结束时再次启动它们,您只需要一些监控和控制脚本。