Oracle:如何“稍后”运行存储过程

Posted

技术标签:

【中文标题】Oracle:如何“稍后”运行存储过程【英文标题】:Oracle: how to run a stored procedure "later" 【发布时间】:2009-03-13 16:14:47 【问题描述】:

我们有一个系统,允许用户将数据连接到数据库中,以设置各种规则,用于在数据合并到主表之前更改数据。例如,订单可能有一个规则,该规则根据客户的地址设置要使用的送货公司。

这最初旨在仅对正在加载的数据进行操作,因此它仅限于您可以从 select 语句中调用的函数。需要注意的重要一点是数据尚未在目标表中。

现在,我有一个项目需要更新到另一个表(很好 - 我可以为此使用自治事务编译指示)。但是,我需要运行一些函数,这些函数需要在运行之前插入数据(即它们正在聚合数据)。

所以,我真的很想排队运行我的程序直到一段时间后(它不依赖于时间)。

我如何在 Oracle 中做到这一点?当我只想做一些简单的事情时,大量的文档是相当庞大的。

【问题讨论】:

"autonomous_transaction pragma" 应谨慎使用 - 主要用于“无论如何都必须审计”的情况。你为什么不保留一个事务 - “更新到另一个表”。 【参考方案1】:
BEGIN
  DBMS_SCHEDULER.create_job (
    job_name => 'daily_tasks_job',
    job_type              => 'STORED_PROCEDURE',
    job_action            => 'prc_daily_tasks',
  repeat_interval       => 'FREQ=DAILY; INTERVAL=1',
  enabled               => TRUE,
  comments              => 'Calls stored procedure once a day'
  );
END;

BEGIN
     DBMS_SCHEDULER.create_job(
    job_name        => 'SHELL_JOB',
    repeat_interval  => 'FREQ=DAILY; BYHOUR=2',
    job_type         => 'EXECUTABLE',
    job_action       => '/u01/app/oracle/admin/tools/shell_job.sh',
    enabled          => TRUE,
    comments         => 'Perform stuff'
);
END;

【讨论】:

【参考方案2】:

对此的标准方法是使用 dbms_jobs 来安排调用该过程的作业。

如果有一些先决条件,作业可以检查先决条件。如果完成,作业会继续,否则会重新安排自己并退出。

【讨论】:

在 Oracle 10 和 11 中您可以使用 dbms_scheduler 或 dbms_job,在 Oracle 9 中您只能使用 dbms_job。

以上是关于Oracle:如何“稍后”运行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何把oracle存储过程保存到数据库里?

如何在 Oracle 存储过程运行时只提交一个查询

如何在 oracle sql developer 中运行存储过程?

oracle存储过程中循环for in是如何使用的

oracle如何调试存储过程

如何使用 Oracle SQL developer 运行存储过程?