2017-07-19 79 views
0
declare 
    n_docid number; 
    n_orgid number; 
    n_docstateid number; 
    n_docstateversion number; 
    n_doctypeid number; 
    n_count number; 
begin 
    for I in (select DOCID from DC_EXP_BO where INF_DATEDOCUMENT > '01.01.17' and 
INF_DATEDOCUMENT < '31.12.17') 
loop 
begin 
    select DOCID, DOCSTATEID, DOCTYPEID, DOCSTATE_VERSION into 
    n_docid, n_docstateid, n_doctypeid, n_docstateversion from DOC 
    where DOCID = I.DOCID; 

    select ORGID into n_orgid from ORG 
    where systemname = (select distinct RB_CODEGRBS from DC_EXP_BO where DOCID = n_docid); 


    select count(*) into n_count from ROUTECONTEXT 
    where DOCID = n_docid and ORGID = n_orgid; 

    if (n_count = 0) then 
    insert into ROUTECONTEXT 
    (ROUTECONTEXTID, VERSION, DOCID, LOCALDOCSTATEID, OWNERID, LASTPRINTDATE, PRINTED, RECEIVED, ORGID, ARCHIVE, EXPORTSTATUS, DOCTYPEID, DOCSTATEID, DOCSTATE_VERSION, DELETED) 
    values 
    (sq_routeContext.NEXTVAL, 0, n_docid, n_docstateid, null, null, 0, 0, n_orgid, 0, 'NOT_EXPORTED', n_doctypeid, n_docstateid, n_docstateversion, 0); 
    end if; 
exception 
    when no_data_found then 
continue; 
end; 
end loop; 
end; 
/

我们为生产写了datafix。还有一个问题。 对于语句select可以返回大约100万个ID。有没有可能优化这个查询?有没有办法优化这个查询?

回答

3

你可以做出最有效的优化是一个基于集的操作,以取代在循环中的行由行插入和查找:

insert into ROUTECONTEXT 
    (ROUTECONTEXTID, VERSION, DOCID, LOCALDOCSTATEID, OWNERID, LASTPRINTDATE, PRINTED, RECEIVED, ORGID, ARCHIVE, EXPORTSTATUS, DOCTYPEID, DOCSTATEID, DOCSTATE_VERSION, DELETED) 
select sq_routeContext.NEXTVAL, 
      0, 
      DOC.DOCID, 
      DOC.DOCSTATEID, 
      null, 
      null, 
      0, 
      0, 
      org.ORGID, 
      0, 
      'NOT_EXPORTED', 
      DOC.DOCSTATEID, 
      DOC.DOCTYPEID, 
      DOC.DOCSTATE_VERSION , 
      0 
from DC_EXP_BO 
    join doc 
     on DC_EXP_BO.DOCID = DOC.DOCID 
    join org 
     on org.systemname = DC_EXP_BO.RB_CODEGRBS 
where DC_EXP_BO.INF_DATEDOCUMENT > date '2017.01.01' 
and DC_EXP_BO.INF_DATEDOCUMENT < date '2017.12.31' 
and not exists (select null 
       from ROUTECONTEXT 
       where ROUTECONTEXT.DOCID = doc.docid 
       and ROUTECONTEXT.ORGID = org.orgid 
       ) 
/

假设DC_EXP_BO.INF_DATEDOCUMENT是一个日期数据类型,使用适当的日期语义可能更具操作性,并且肯定会更安全。但是它是一个字符串,用你在问题中发布的内容替换WHERE子句的那一点。

+0

它工作!我不能为你的业力加上+,因为没有足够的声望。 –

+0

你问了这个问题,你可以对自己的问题进行投票并接受答案。 – APC

+0

@APC:不错的方法! –

相关问题