系统有要求定时修改大数据量的数据,而且对时间要求较高,最后决定使用数据库级的定时任务,job调用存储过程的方式实现
一下是具体步骤
1、一下是创建存储的sql、
--创建存储过程
create or replace procedure UPD_SAMPLE_CNT_BY_DONOR is
--复合数据类型下记录型的创建
--语法:TYPE 记录类型名 IS RECORD (分量列表 ),至于复合类型,推荐:http://blog.163.com/idea_/blog/static/180970262201181635319104/
type DONOR_ROW_TYPE IS RECORD(
DONOR_ID VARCHAR2(50),
CNT number);
--创建DONOR_ROW_TYPE类型的数组
TYPE DONOR_TBL_TYPE IS TABLE OF DONOR_ROW_TYPE INDEX BY BINARY_INTEGER;--(INDEX BY BINARY_INTEGER:下标自增长)
--定义数据变量
V_DONOR_TBL_TYPE DONOR_TBL_TYPE;
begin
select DONOR.D0010 AS DONOR_ID, count(SAMPLET.D0010) AS CNT BULK COLLECT
INTO V_DONOR_TBL_TYPE--(BULK COLLECT INTO 变量名:把查询的结果批量存入数组变量)
from BIO.T00610 donor
left join BIO.T00900 SAMPLET
ON SAMPLET.D0260 = DONOR.D0010
and SAMPLET.D0260 is not null
where
SAMPLET.Z0070 = 0
group by DONOR.D0010
order by DONOR.D0010;
--循环 批量修改
FORALL i IN 1 .. V_DONOR_TBL_TYPE.COUNT
UPDATE BIO.T00610
SET F0010 = V_DONOR_TBL_TYPE(i).CNT
WHERE D0010 = V_DONOR_TBL_TYPE(i).DONOR_ID;
COMMIT;
end;
2、一下是创建job的sql
--创建job
declare sampleJob number;
begin
dbms_job.submit(sampleJob,
'UPD_SAMPLE_CNT_BY_DONOR;',--UPD_SAMPLE_CNT_BY_DONOR: 调用的存储过程
sysdate, 'SYSDATE + 10/(60*24*60)');--sysdate :开始执行时间,此处省略下一次执行时间,SYSDATE + 10/(60*24*60):执行周期
commit;
end;