使用 dbms_job 在包内执行 oracle 中的存储过程

Posted

技术标签:

【中文标题】使用 dbms_job 在包内执行 oracle 中的存储过程【英文标题】:Executing stored procedures in oracle inside a package using dbms_job 【发布时间】:2017-01-31 08:41:31 【问题描述】:

我正在尝试使用 DBMS_JOB 通过包执行多个存储过程。即使作业正在提交并在 USER_JOBS 中显示,但由于某种原因它没有开始。我尝试过使用和不使用具有相同结果的“开始日期”参数,即没有开始。

我正在使用 ORACLE 9i,我想我不能使用 dbms_scheduler。

在代码下方找到:

--PACKAGE BODY--

create or replace
PACKAGE BODY PKG_TEST IS

  PROCEDURE PASSPORT_DC_1 IS

  l_jobno binary_integer;
  l_jobno1 binary_integer;

    BEGIN

       dbms_job.submit(l_jobno1, 'BEGIN SP_ABC(); END;',SYSDATE );
       DBMS_OUTPUT.PUT_LINE('SP_UPDATE_TIDCUMTL :' || l_jobno1);
       COMMIT;

       dbms_job.submit(l_jobno, 'BEGIN SP_XYZ(); END;',SYSDATE);
       DBMS_OUTPUT.PUT_LINE('SP_UPDATE_TIDPTDTL :' || l_jobno);
       COMMIT; 

  END PASSPORT_DC_1;

--PACKAGE SPEC--

create or replace PACKAGE PKG_TEST AS

  PROCEDURE PASSPORT_DC_1;

END PKG_TEST;

【问题讨论】:

我使用 9i 已经有一段时间了,但尝试将 start_date 设置为 SYSDATE + 1/1440。通过查看 DBA_JOBS 来检查作业定义是否与您期望的一样,并且该作业没有“损坏”。然后看看你是否可以使用带有 jobid 的 DBMS_JOB.RUN 强制作业运行。 当我尝试通过执行 DBMS_JOB.RUN(job id) 手动运行它时。它正在执行,但是由于 DBMS_JOB.RUN(job id) 顺序执行作业,并行性的目的被破坏了。在示例中,有 2 个作业必须并行启动。 【参考方案1】:

dbms_job.submit的3.参数为区间(see doc)。如果您只想运行一次存储过程,请尝试省略第三个参数(SYSDATE)。:

dbms_job.submit(l_jobno1, 'BEGIN SP_ABC(); END;');

【讨论】:

我也省略了最后一个参数。 dbms_job.submit(l_jobno1, 'BEGIN SP_ABC(); END;' ); DBMS_OUTPUT.PUT_LINE('SP_ABC() :' || l_jobno1);犯罪;工作还没有开始

以上是关于使用 dbms_job 在包内执行 oracle 中的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

做一个,记一篇 — Java调用Oracle存储过程

如何在包内引用 Python 中的***模块?

Oracle dbms_job

如何停止 Oracle dbms_job

在包内多次运行收集表统计信息会导致性能问题

oracle定时任务(dbms_job)