代码无效。这需要一个永恒的运行

时间:2015-12-30 05:12:54

标签: oracle performance oracle11g oracle10g

下面的代码会持续一段时间。 正如您所看到的,我必须从一个表中获取值并使用该值来检查第二个表是否包含它,并插入第一个表中的第三个表值。 还有其他方法吗?

create or replace PROCEDURE KPI_AVAILABILITY (
    v_programid varchar2
    )
AS 
         v_MASTER_KPI_ID number;
         v_UDF varchar2(100);
         v_count number;

    cursor c1 is 
       (select MASTER_KPI_ID,UDF from KPI_MASTER 
        where UDF is not null
        and ISACTIVE = 1
        --order by MASTER_KPI_ID,udf
       );

BEGIN
  open c1 ;
  fetch c1 into v_MASTER_KPI_ID,v_UDF;

  while v_UDF is not null
  loop
     select count(v_UDF) into v_count 
     from vw_ticket 
     where v_UDF is not null
     and amsprogramid = v_programid;
     if v_count is not null or v_count <> 0 then
           delete from program_kpi where amsprogramid = v_programid;
           INSERT INTO PROGRAM_KPI (AMSPROGRAMID,MASTER_KPI_ID,LASTUPDATEDBYDATALOAD) 
            VALUES(V_PROGRAMID,v_MASTER_KPI_ID,to_char(sysdate,'dd-mon-yy hh.mi.ss')); 
            dbms_output.put_line('xyz');
        end if;
    end loop;
    close c1;

END KPI_AVAILABILITY;

2 个答案:

答案 0 :(得分:3)

来自其他开发人员代码的逆向工程业务规则总是很棘手,尤其是在不了解更广泛的域的情况下。但是,在循环的中心是program_kpi的DELETE,然后是INSERT到同一个表中。如果amsprogramid = v_programid上没有匹配的记录,那么您是否正在插入记录,如果有匹配则有效,您只需使用当前更新 lastupdatedbydataload SYSDATE。

在其他情况下,它似乎是MERGE的逻辑。因此,您的代码可能完全被单个语句替换。如果是这样,这可能比游标循环中的逐行激活行更有效。

merge into program_kpi pkpi
using (select kpim.master_kpi_id
              , kpim.udf 
              , v_programid
       from kpi_master kpim
        where kpim.udf is not null
        and kpim.isactive = 1
        and exists ( select null 
                      from vw_ticket tkt
                      where tkt.amsprogramid = v_programid)
       ) kpim
on (kpim.v_programid = pkpi.programid
    and kpim.master_kpi_id = pkpi.master_kpi_id)
when not matched then
    insert values (kpim.v_programid, kpim.master_kpi_id, sysdate)
when matched then
    update 
    set pkpi.lastupdatedbydataload = sysdate;

请检查此代码的结果以及您的预期结果。正如我所说,逆向工程业务逻辑很难,master_kpi_idprogramid上的匹配与仅在programid上删除不同。

答案 1 :(得分:2)

首次提取后,您不会更改v_UDF。然后循环比较它与相同的第一个值...比较和比较...比较和比较。