本文中我们根据一段错误代码从而来分析如何解决JOB的Interval输入参数过长的问题 给出的运行JOB的PL/SQL代码为 DECLAREjob BINARY_INTEGER := :job;next_date DATE := :mydate;broken BOOLEAN := FALSE;BEGINWHAT:mydate := next_date;IF broken THEN :b := ; ELSE :b :=; END IF; END; 并说明了如何使用NEXT_DATE作为存储过程的输出参数来指定下次JOB的下次运行时间 第一次看到这里的时候一方面是感歎这种内部的东西一般人是无法得到的只有Tom这种内部人士才能得到另一方面是佩服Tom的功力说实话即使是把代码给我我也想不出这么巧妙的方法 这次重读这部分内容有了一点新的想法对于BROKEN变量是否也可以做点什么? 采用和上面类似的方法可以控制JOB的行为使JOB成功运行一次后就自动停止不在执行由于普通的一次性JOB在运行后就从JOB视图中消失了如果希望留下运行信息则必须使用日志表十分的麻烦而采用下面的方法处理一次性JOB可以方便将JOB的运行信息保留下来 SQL> CONN /@YANGTK AS SYSDBA已连接 SQL> GRANT EXECUTE ON DBMS_LOCK TO YANGTK;授权成功 SQL> CONN YANGTK/YANGTK@YANGTK 已连接 SQL> CREATE OR REPLACE PROCEDURE P_TEST (P_BROKEN OUT BOOLEAN) AS BEGIN P_BROKEN := TRUE; DBMS_LOCKSLEEP(); END; /过程已创建 SQL> DECLARE V_JOB NUMBER; BEGIN DBMS_JOBSUBMIT(V_JOB P_TEST(BROKEN); SYSDATE SYSDATE + /); COMMIT; END; /PL/SQL 过程已成功完成SQL> COL WHAT FORMAT ASQL> SELECT JOB WHAT TOTAL_TIME BROKEN FAILURES FROM USER_JOBS;JOB WHAT TOTAL_TIME B FAILURES P_TEST(BROKEN); NSQL> SELECT JOB WHAT TOTAL_TIME BROKEN FAILURES FROM USER_JOBS;JOB WHAT TOTAL_TIME B FAILURES P_TEST(BROKEN); Y 采用这种方法运行一次后JOB不再运行但是JOB信息并没有丢失仍然保留在USER_JOBS视图中 |