最近在写一个存储过程实现对接的数据入库操作,记录下过程中出现的一些技术
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;
以上仅是个人操作,如有问题麻烦指正