中易网

求 Oracle 大神指教,更具时间自动更新状态

答案:3  悬赏:10  
解决时间 2021-12-28 10:43
我有一张表,字段: Status(状态)、ExpireTime(过期时间)
效果:ExpireTime < SystemTime(当前时间) 时:状态为:未过期
ExpireTime > SystemTime 时:状态为:已过期
能不能自动实现更新?(即: 当SystemTime大于ExpireTime时,数据库自动将Status更新为已过期)......
求指点,
最佳答案
数据库上建一个JOB,定时执行,JOB的内容是执行一个存储过程,在存储过程中做你想做的检查和更新。
全部回答
创建一个存储过程来更新表的数据,然后在创建一个job,实现每天的午夜0点更新状态信息。
在oracle新建一个job 这个job可以设定时间 自动运行的!~ 创建 variable job_feeid_create NUMBER; begin sys.dbms_job.submit(:job_feeid_create,'wlk_check_fee;',sysdate,'TRUNC(SYSDATE+1)'); commit; end; 在命令控制台中这样就可以建产一个作业了。sysdate表示当前作业将来执行的时间,sysdate+1表示调用频率。 描述 INTERVAL参数值 每天午夜12点 'TRUNC(SYSDATE + 1)' 每天早上8点30分 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)' 每星期二中午12点 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24' 每个月第一天的午夜12点 'TRUNC(LAST_DAY(SYSDATE ) + 1)' 每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' 每星期六和日早上6点10分 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)' 运行 begin dbms_job.run(:job_feeid_create); end; 查询作业记录 select * from user_jobs 具体讲解: 1.确保Oracle的工作模式允许启动任务队列管理器 Oracle定时执行“Job Queue”的后台程序是SNP进程,而要启动SNP进程,首先要确保整个系统的模式是可以启动SNP进程的,这需要以 DBA的身份去执行如下命令: svrmgrl>; alter system enable restricted session; 或sql>; alter system disenable restricted session; 利用如上命令更改系统的会话方式为disenable restricted,为SNP的启动创造条件。 2.确保Oracle的系统已经配置了任务队列管理器的启动参数 SNP的启动参数位于Oracle的初始化文件中,该文件放在$ORACLE_HOME/dbs路径下,如果Oracle的SID是myora8的话,则初始化文件就是 initmyora8.ora,在文件中对SNP启动参数的描述部分如下: job_queue_process=n job_queue_interval=N 第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。 第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状 态,睡眠一段时间后,由系统的总控负责将其唤醒。 如果该文件中没有上面两行,请按照如上配置添加。配置完成后,需要重新启动数据库,使其生效。注意:如果任务要求执行的间隔很短的 话,N的配置也要相应地小一点。 3.将任务加入到数据库的任务队列中 用Oracle的dbms_job包中的存储过程,将任务加入到任务队列中: dbms_job.submit( job out binary_integer, what       in   archar2, next_date     in   date, interval     in   varchar2, no_parse     in   boolean) 其中: ●job:输出变量,是此任务在任务队列中的编号; ●what:执行的任务的名称及其输入参数; ●next_date:任务执行的时间; ●interval:任务执行的时间间隔。 下面详细讨论一下dbms_job.submit中的参数interval。严格地讲,interval是指上一次执行结束到下一次开始执行的时间间隔,当interval设置为null 时,该job执行结束后,就被从队列中删除。假如我们需要该job周期性地执行,则要用‘sysdate+m’表示。 将任务加入到任务队列之前,要确定执行任务的数据库用户,若用户是scott, 则需要确保该用户拥有执行包dbms_job的权限;若没有,需要以 DBA的身份将权利授予scott用户: svrmgrl>; grant execute on dbms_job to scott; 4.将要执行的任务写成存储过程或其他的数据库可执行的pl/sql程序段 例如,我们已经建立了一个存储过程,其名称为my_job,在sql/plus中以scott用户身份登录,执行如下命令: sql>; variable n number; sql>; begin dbms_job.submit(:n‘my_job;’,sysdate, ‘sysdate+1/360’); commit; end; / 系统提示执行成功。 Sql>; print :n; 系统打印此任务的编号,例如结果为300。 如上,我们创建了一个每隔4分钟执行一次的任务号为300的任务。可以通过Oracle提供的数据字典user_jobs察看该任务的执行情况: sql>; select job,next_date,next_sec,failures,broken from user_jobs; 执行结果如下: job next_date next_sec failures broken 300 2000/10/10 11:45:15 0 N 这表示任务号为300的任务,下一次将在2000/10/10 11:45:15执行,此任务的执行失败记录为0次。注意:当执行job出现错误时,Oracle将其记录在日志里,失败次数每次自动加1。当执行失败次数达到16时,Oracle就将该job标志为broken。此后,Oracle不再继续执行它,直到用户调用过程dbms_job.broken,重新设置为not broken,或强制调用dbms_job.run来重新执行它。 除了以上我们讨论的submit存储过程之外,Oracle还提供了其他许多存储过程来操作任务。例如:dbms_job.change 、 dbms_job.what、dbms_job.interval可以用来修改提交的任务。要想删除该任务,只需运行dbms_job.remove(n)即可,其中n为任务号。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
日引月长的意思是什么啊?请解释下!
拍一组照片品味青春作文开头
未应的意思是什么?未应的释义是什么啊?
零度的英文怎么说啊
受热面的作用和分类
播洒的意思是什么啊?请解释下!
橋堍的意思是什么?橋堍的释义是什么啊?
我的儿子头围小,如何补救
货宝的意思是什么?货宝的释义是什么啊?
亦庄创意生活广场里都有什么
綀衣的意思是什么啊?请解释下!
骨董饭的意思是什么?骨董饭的释义是什么啊?
在广西这边做火锅有没有市场
門藩的意思是什么?門藩的释义是什么啊?
泣詩的意思是什么?泣詩的释义是什么啊?
推荐资讯
因为我太烦她了,她说我凭什么管她,干涉她的
周文王祖籍是哪里人
我是安卓4.4.2玩圣安地列斯昨天开始只要任务
端门的意思是什么啊?请解释下!
不用万用表的情况 怎么判断加热管好坏?
哺乳期可以穿哺乳胸罩吗?
周家庄居委会地址有知道的么?有点事想过去!
请问窦性心动过缓伴窦性心律不齐算不算心电图
司馬琴心的意思是什么?司馬琴心的释义是什么
合美的意思是什么?合美的释义是什么啊?
软件工程专业的分流问题
珲春市慧源幼儿园地址在什么地方,我要处理点
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?