用plsql写了个存储过程,用定时任务触发,可是执行好慢,千条数据要执行几分钟,请教高手帮忙!
create or replace procedure DE_KC_STORE(v_createdate in varchar2 :=to_char(sysdate-1105,'yyyymmdd'),
v_validflag1 in number :=0,
v_validflag2 in number :=4) is
--创建游标
cursor m_cur is
select * from s_store_t where validflag in(v_validflag1,v_validflag2) and
createdate < to_date(v_createdate,'yyyy-mm-dd')
order by createdate asc;
m_row m_cur%rowtype;
begin
open m_cur;
loop
fetch m_cur
into m_row;
exit when m_cur%notfound;
insert into s_store_backup_t (ID,MATERIALID,VALIDFLAG,QFLAG,MATCHID,STORECODE,STORENAME,POSTIONID,STOERPOS,
MATERIALCODE,MATERIALNAME,FOLDERCODE,STEELCODE,STEELNAME,MATERIALSPECCODE,MATERIALSPEC,
MATERIALSIZE,ISSTANDARD,SOURCECODE,SOURCENAME,BATCHNO,BATCHNO_XN,LOTNUMBER,MATERIALTOTALCOUNT,
MATERIALTOTALWEIGHT,MATERIALCOUNT,MATERIALWEIGHT,DOSTANDARD,LICENCE,MAINCOMP,AGEING,CREATEMAN,
CREATEDATE,UPDATEMAN,UPDATEDATE,MEMO,RECORDTYPE,TESTMAN,TESTDATE,HEATNO,LZJNO,POSLEVEL,POSDIRECTION,
FIREDCOUNT,ZG,RSFLAG,GROSS,SUTTLE,CHECKMAN,ORDERNUMBER,STEELALIAS,WORKGROUP,WORKGROUPINDEX,PRODUCTATTRIBUTES,
COUNTNUMBER,PRINTTIME,TSMEMO,ORDERNO,TGCJ,ZHIXINGBIAOZHUN,YGR,YGDATE,HYR,HYDATE,ZFR,ZFDATE,YGMEMO,
PFMEMO)
values(m_row.id,m_row.materialid,m_row.validflag,m_row.qflag,m_row.matchid,m_row.storecode,
m_row.storename,m_row.postionid,m_row.stoerpos,m_row.materialcode,m_row.materialname,
m_row.foldercode,m_row.steelcode,m_row.steelname,m_row.materialspeccode,m_row.materialspec,
m_row.materialsize,m_row.isstandard,m_row.sourcecode,m_row.sourcename,m_row.batchno,
m_row.batchno_xn,m_row.lotnumber,m_row.materialtotalcount,
m_row.materialtotalweight,m_row.materialcount,m_row.materialweight,m_row.dostandard,
m_row.licence,m_row.maincomp,m_row.ageing,m_row.createman,m_row.createdate,
m_row.updateman,m_row.updatedate,m_row.memo,m_row.recordtype,m_row.testman,m_row.testdate,
m_row.heatno,m_row.lzjno,m_row.poslevel,m_row.posdirection,m_row.firedcount,m_row.zg,m_row.rsflag,m_row.gross,
m_row.suttle,m_row.checkman,m_row.ordernumber,m_row.steelalias,m_row.workgroup,m_row.workgroupindex,m_row.productattributes,
m_row.countnumber,m_row.printtime,m_row.tsmemo,m_row.orderno,m_row.tgcj,m_row.zhixingbiaozhun,m_row.ygr,m_row.ygdate,
m_row.hyr,m_row.hydate,m_row.zfr,m_row.zfdate,m_row.ygmemo,m_row.pfmemo);
commit;
delete from s_store_t where validflag in(v_validflag1,v_validflag2) and
createdate < to_date(v_createdate,'yyyy-mm-dd');
commit;
--to_date(v_createdate,'yyyy-mm-dd');
end loop;
end DE_KC_STORE;
上面是存储过程,原来没有对insert into和delete后面加commit,使用jobs存储过程基本就不调用,之后加了commit后,虽然调用,但数据量上千条时,执行就好慢?请问高手,commit放置位置是不是有什么学问?还有如果把delete放到end loop之后,会不会好一点?
v_validflag1 in number :=0,
v_validflag2 in number :=4) is
--创建游标
cursor m_cur is
select * from s_store_t where validflag in(v_validflag1,v_validflag2) and
createdate < to_date(v_createdate,'yyyy-mm-dd')
order by createdate asc;
m_row m_cur%rowtype;
begin
open m_cur;
loop
fetch m_cur
into m_row;
exit when m_cur%notfound;
insert into s_store_backup_t (ID,MATERIALID,VALIDFLAG,QFLAG,MATCHID,STORECODE,STORENAME,POSTIONID,STOERPOS,
MATERIALCODE,MATERIALNAME,FOLDERCODE,STEELCODE,STEELNAME,MATERIALSPECCODE,MATERIALSPEC,
MATERIALSIZE,ISSTANDARD,SOURCECODE,SOURCENAME,BATCHNO,BATCHNO_XN,LOTNUMBER,MATERIALTOTALCOUNT,
MATERIALTOTALWEIGHT,MATERIALCOUNT,MATERIALWEIGHT,DOSTANDARD,LICENCE,MAINCOMP,AGEING,CREATEMAN,
CREATEDATE,UPDATEMAN,UPDATEDATE,MEMO,RECORDTYPE,TESTMAN,TESTDATE,HEATNO,LZJNO,POSLEVEL,POSDIRECTION,
FIREDCOUNT,ZG,RSFLAG,GROSS,SUTTLE,CHECKMAN,ORDERNUMBER,STEELALIAS,WORKGROUP,WORKGROUPINDEX,PRODUCTATTRIBUTES,
COUNTNUMBER,PRINTTIME,TSMEMO,ORDERNO,TGCJ,ZHIXINGBIAOZHUN,YGR,YGDATE,HYR,HYDATE,ZFR,ZFDATE,YGMEMO,
PFMEMO)
values(m_row.id,m_row.materialid,m_row.validflag,m_row.qflag,m_row.matchid,m_row.storecode,
m_row.storename,m_row.postionid,m_row.stoerpos,m_row.materialcode,m_row.materialname,
m_row.foldercode,m_row.steelcode,m_row.steelname,m_row.materialspeccode,m_row.materialspec,
m_row.materialsize,m_row.isstandard,m_row.sourcecode,m_row.sourcename,m_row.batchno,
m_row.batchno_xn,m_row.lotnumber,m_row.materialtotalcount,
m_row.materialtotalweight,m_row.materialcount,m_row.materialweight,m_row.dostandard,
m_row.licence,m_row.maincomp,m_row.ageing,m_row.createman,m_row.createdate,
m_row.updateman,m_row.updatedate,m_row.memo,m_row.recordtype,m_row.testman,m_row.testdate,
m_row.heatno,m_row.lzjno,m_row.poslevel,m_row.posdirection,m_row.firedcount,m_row.zg,m_row.rsflag,m_row.gross,
m_row.suttle,m_row.checkman,m_row.ordernumber,m_row.steelalias,m_row.workgroup,m_row.workgroupindex,m_row.productattributes,
m_row.countnumber,m_row.printtime,m_row.tsmemo,m_row.orderno,m_row.tgcj,m_row.zhixingbiaozhun,m_row.ygr,m_row.ygdate,
m_row.hyr,m_row.hydate,m_row.zfr,m_row.zfdate,m_row.ygmemo,m_row.pfmemo);
commit;
delete from s_store_t where validflag in(v_validflag1,v_validflag2) and
createdate < to_date(v_createdate,'yyyy-mm-dd');
commit;
--to_date(v_createdate,'yyyy-mm-dd');
end loop;
end DE_KC_STORE;
上面是存储过程,原来没有对insert into和delete后面加commit,使用jobs存储过程基本就不调用,之后加了commit后,虽然调用,但数据量上千条时,执行就好慢?请问高手,commit放置位置是不是有什么学问?还有如果把delete放到end loop之后,会不会好一点?
...全文
相关推荐
plsql创建存储过程并创建job定时任务执行-详细笔记文档总结
plsql创建存储过程并创建job定时任务执行详细笔记文档总结在 Oracle 中,plsql 是一种强大的编程语言,可以用来创建存储过程和定时任务执行。
plsql教程大全(语法入门、操作plsql、存储过程、函数、触发器、游标、包、返回类型)
语法入门、操作plsql、存储过程、函数、触发器、游标、包、返回类型;一个execle表轻松搞定。
练习利用PLSQL Developer编写和管理存储过程、存储函数和触发器等
PLSQL Developer中存储过程、存储函数和触发器的编写和管理PLSQL Developer是一种功能强大的Oracle数据库开发工具,提供了许多功能来帮助开发者快速编写和管理存储过程、存储函数和触发器等高级数据库对象
PLSQL调试存储过程
在Oracle数据库环境中,PL/SQL(Procedural Language/Structured Query Language)是一种强大的编程语言,用于编写存储过程、函数、触发器等数据库对象。
PLSQL中存储过程的建立,导出,导入,使用
### PL/SQL中存储过程的建立、导出、导入与使用#### 一、存储过程的概念及优势存储过程是一种数据库对象,它是由一系列SQL语句组成的预编译的程序块,存储在数据库中,可以通过调用的方式执行。


基础和管理
