oracle – 如何让我的DBA暂停并恢复更新大表中每一行的存储过程?

oracle – 如何让我的DBA暂停并恢复更新大表中每一行的存储过程?,第1张

概述我有一个大约一百万行的表,我需要用一个冗长的计算结果更新表中的每一行(计算得到每行的可能不同的结果).因为它很耗时,所以DBA必须能够控制执行.这个特殊的计算需要每年运行一次(它是年终摘要).我想使用DBMS_SCHEDULER.CREATE_JOB创建一个作业,它可以从表中获取100行,更新它们然后停止;然后,下一次执行该作业将获取先前执行停止的位置. 我的第一个想法是在我的存储过程结束时包含此 我有一个大约一百万行的表,我需要用一个冗长的计算结果更新表中的每一行(计算得到每行的可能不同的结果).因为它很耗时,所以DBA必须能够控制执行.这个特殊的计算需要每年运行一次(它是年终摘要).我想使用DBMS_SCHEDulER.CREATE_JOB创建一个作业,它可以从表中获取100行,更新它们然后停止;然后,下一次执行该作业将获取先前执行停止的位置.

我的第一个想法是在我的存储过程结束时包含此代码:

-- update 100 rows,storing the primary key of the last-- updated row in last_ID-- make a new job that will run in about a minute and will-- start from the primary key value just after last_IDdbms_scheduler.create_job( job_name=>'yearly_summary',job_type=>'STORED_PROCEDURE',job_action=>'yearly_summary_proc(' || last_ID || ')',start_date=>CURRENT_TIMESTAMP + 1/24/60,enabled=>TRUE);

但是,当存储过程运行时,我收到此错误:

ORA-27486: insufficIEnt privilegesORA-06512: at "SYS.DBMS_ISCHED",line 99ORA-06512: at "SYS.DBMS_SCHEDulER",line 262ORA-06512: at "JBUI.YEARLY_SUMMARY_PROC",line 37ORA-06512: at line 1

欢迎提出其他方法的建议.我更喜欢使用DBMS_SCHEDulER,我宁愿不必创建任何表;这就是我将last_ID传递给存储过程的原因.

解决方法 我倾向于谨慎使用这样的工作来控制执行.连续作业之间的延迟往往太短,以至于DBA无法确定要杀死/暂停/等等的工作,或者延迟时间足够长,以至于大部分运行时间将用于连续作业之间的延迟.

在不创建任何新对象的情况下,您可以使用DBMS_ALERT程序包来允许DBA发送暂停作业的警报.您的代码可以每100行调用DBMS_ALERT.WAITONE方法来检查DBA是否已发出特定警报(即PAUSE_YEAREND_JOB警报).如果未收到任何警报,则代码可以继续.如果收到警报,您可以暂停代码,直到收到另一个警报(即RESUME_YEAREND_JOB)或一段固定的时间,或者根据DBA使用PAUSE_YEAREND_JOB警报发送的消息(即消息可能是几秒钟暂停或暂停的日期,等等)

当然,您可以通过创建新表来执行相同的 *** 作,让DBA向表中写入一行来暂停作业,并从表中读取每N行.

总结

以上是内存溢出为你收集整理的oracle – 如何让我的DBA暂停并恢复更新大表中每一行的存储过程?全部内容,希望文章能够帮你解决oracle – 如何让我的DBA暂停并恢复更新大表中每一行的存储过程?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/sjk/1166921.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-01
下一篇2022-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存