oracle之存储过程

最近在写一个存储过程实现对接的数据入库操作,记录下过程中出现的一些技术

1.存储过程打印

DBMS_OUTPUT.put_line(v_sql);

2.存储过程实现DBMS_JOBS定时执行

在PLSQL里有一个DBMS_JOBS,在这里新建,如下

代码大概是这样

begin
  sys.dbms_job.submit(job => :job,
                      what => 'chuchu_proc;',--存储过程名称
                      next_date => to_date('24-09-2021 15:27:00', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'TRUNC(sysdate,'mi') + 30/(24*60)');--定时执行时间
  commit;
end;
/ 

 关于DBMS_JOBS配置定时

时间间隔
Interval => TRUNC(sysdate,'mi') + 1/(24*60) --每分钟执行

每天定时执行
Interval => TRUNC(sysdate) + 1 +1/(24)  --每天的凌晨1点执行

每周定时执行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 --每周一凌晨1点执行

每月定时执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24  --每月1日凌晨1点执行

每季度定时执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24  --每季度的第一天凌晨1点执行

每半年定时执行
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24  --每年7月1日和1月1日凌晨1点

每年定时执行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'), 12)+1/24  --每年1月1日凌晨1点执行

查看jobs
SELECT * FROM dba_jobs;

3.创建存储过程及需要注意的事项

create or replace procedure cunchu_proc IS
  --定义变量
  v_uuid          varchar2(100);
  V_STATE          varchar2(32);


BEGIN
  --FOR循环根据条件获取number数据   
  FOR d IN (select t.* from  TABLENAME t where ... ) LOOP
   --根据第一层for循环的结果查询数据,在存储过程begin和end之间,如果用select语句的话,就必须使用into
    select decode(MAX(T.STATE),'0','YJJ','3','TB','QT')  INTO V_STATE FROM TABLENAME2 T WHERE  T.number = d.number;
    --第二层for循环  根据第一层结果遍历查询第二层循环体的数据
    FOR r IN (select p.* from TABLENAME3 p where p.number = d.number ) LOOP
      --获取for循环的数据判断是否为空,并赋值给v_uuid
      IF r.text1 IS NOT NULL THEN
        select r.text1 into v_uuid from dual;
      end if;
      --主键为空的时候新增数据
       IF v_uuid is NULL THEN      
        insert into TABLENAME5(uuid,names,exchange_time,STATE) values(r.ID,r.names,SYSDATE,V_STATE);
        commit;
      END IF;
      --如果存在数据,需要进行部分数据修改
      IF v_uuid IS NOT NULL THEN
        UPDATE TABLENAME4 F  SET F.names = r.names,F.STATE=V_STATE WHERE F.uuid = r.ID;
        COMMIT;
      END IF;
      --删除操作暂未使用到     
      --打印输出数据
       DBMS_OUTPUT.put_line(d.number);
       DBMS_OUTPUT.put_line(r.id);
    END LOOP;
    commit;
  END LOOP;
end cunchu_proc;

以上仅是个人操作,如有问题麻烦指正

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值