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:如何“稍后”运行存储过程的主要内容,如果未能解决你的问题,请参考以下文章