plsql定时任务制作有感

PLSQL定时任务制作有感

我又来了,这次是因为一个新的任务,虽然这个任务发下来已经有快一个月了,但我之前已经写过一个timetask来解决这个问题,可接下来的问题是这个timetask放在什么地方啊……于是,我选择换种方式,用plsql去解决,结果就发生了下面的事情。
首先,用plsql去制作定时任务,需要去创建定时任务。
其次,创建定时任务,你需要去运行一个存储过程。
接下来,一个存储过程需要完成你想做的需求。
最后,我需要完成的需求必须是用游标……
然后……我就悲剧了,因为没有接触过plsql,所以关于这些东西我都不懂,那就看吧。
关于游标,网上有很多代码,但这些代码……
不说了,各种代码各种写出来报错,下面我把我写的代码放在下面,让大家帮忙掌掌眼。

create or replace procedure check_status_time is
  v_date number(2,0);
  v_data varchar(20);
  s_time varchar(20); 
  s_time_h number(2,0);
  s_date varchar(20);
  cursor get_time is select * from hy_reservation where status = 3;
begin
  v_date := to_number(to_char(sysdate,'hh'));
  v_data := to_char(sysdate,'yyyy-MM-dd');
   --save_time为临时变量名,自己任意起
   for save_time in get_time loop
     --截取数据库中的时间
    s_time := substr(save_time.reservetime,instr(save_time.reservetime,'-')+1);
    --截取时间中小时位置的数据并转化成number类型
    s_time_h := to_number(substr(s_time,1,instr(s_time,':')-1));
    --获得预约表中的日期
    s_date := save_time.reservedate;
    --判断截取的时间与当前时间的大小
    if v_data > s_date then 
      dbms_output.put_line('这个日期比较大');
      if s_time_h > v_date then
        Dbms_Output.put_line('当前时间未过期');       
        --输出某个字段,使用"变量名.列名"即可。
        Dbms_Output.put_line(save_time.reservetime);
        Dbms_Output.put_line(s_time_h);
      else
        Dbms_Output.put_line('当前时间已过期');
        update hy_reservation set status = 4 where reservetime = save_time.reservetime ;
      end if; 
    else
      dbms_output.put_line('这个日期比较小');
      update hy_reservation set status = 4 where reservetime = save_time.reservetime ;
    end if;       
  end loop;
--处理拨错信息
EXCEPTION
when others then 
ROLLBACK;
end check_status_time;

这是我写的代码,但根据网上百度到的游标,以及一些朋友自己写的实例,我发现……完全不一样啊!!难道说跟oracle的版本不同有关么?
我使用的oracle是11g的版本
下面我带上几个链接,大家去对比一下。

https://www.cnblogs.com/happy2016/p/6183003.html
这个是说几种游标的用法
https://blog.csdn.net/qq_24689783/article/details/78667307
这个也是游标的用法

在这两篇文章里面,关于定义游标,他们都使用了declare这个关键词,可是在我的plsql中,我只要使用declare就会出现各种报错,而最常见的报错代码莫过于下面这一条:

PROCEDURE US_TRDP_HCH_ADMIN.CHECK_STATUS_TIME 编译错误

错误:PLS-00103: 出现符号 "DECLARE"在需要下列之一时:
        begin function pragma
          procedure subtype type 
           current cursor delete
          exists prior
       符号 "begin" 被替换为 "DECLARE" 后继续。
行:7
文本:declare

错误:PLS-00103: 出现符号 "end-of-file"在需要下列之一时:
        ( begin case
          declare end exception exit for goto if loop mod null pragma
          raise return select update while with 
            <<
          continue close current delete fetch lock insert open rollback
          savepoint set sql execute commit forall merge pipe purge
行:42

我直接在声明游标前插入了这个关键词,结果就出现了这种错误。
我认真思考了一下,是不是应该换种方法,结果……我将开头的create or replace替换成了declare……迎来的却是更大的报错……
一步错步步错,最后的结果是我用了大概一个星期的时间去慢慢整理……最后,在一个地方找到了我想要的……那就是百度经验……没错就是在百度经验里面找到了……

https://jingyan.baidu.com/article/67508eb437e39e9ccb1ce46a.html
言简意赅,没有多余的个人经验,只有几句作用说明以及游标实例……

我只想说为啥我没有早点看到这个百度经验……

ps:另外我想强调一句。
pls-00103这个错误不仅是在你用了不恰当的关键词时出现,当你用错了表单符号或者少写一个end都有可能出现。

游标处理完了,就该存储过程了。在制作存储过程的时候建议大家不断的去点击运行,这样可以提前预防错误的出现,防止自己写了一堆代码,结果运行报错还找不到错误在哪里……总的来说存储过程还是不容易出错的地方。我也就不多说了。

然后,挡在我面前的就只剩下定时任务,而定时任务的时间间隔网上也都有,这里附上一个链接:

https://www.cnblogs.com/yx007/p/6519544.html

在制作定时任务的时候也会有错误,那就是这个!
plsql定时任务制作有感_第1张图片
这个错误很多时候在网上也找不到处理方式,但归根结底还是一个问题。
请注意what里面的存储过程一定要带上分号!“;”对,就是这个分号,没有这个分号就会报错,而有这个分号就可以正确的开启你想要的定时任务了!

最后,希望我的错误可以帮助大家少犯错误,谢谢。

你可能感兴趣的:(plsql定时任务制作有感)