代码无法正常工作。它需要一个永恒的运行

问题描述:

下面的代码运行永恒。 正如你所看到的,我必须从一个表中取值,并使用该值来检查第二个表是否包含它,并从第一个表中插入到第三个表中。 有没有其他方法可以做到这一点?代码无法正常工作。它需要一个永恒的运行

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; 
+0

你需要显示一些样本数据和所需的结果。无法从您的代码中推断出这一点。 – Noel

+1

这个表达式是多余的,可能是错误的:'v_count不为空或v_count 0' - 如果v_count不为空,前面的查询保证它不为零。为什么不简单使用'v_count> 0'? –

+0

从性能角度看,您应该将'vw_ticket'上的子查询合并到游标查询中,以减少所需的工作量,并减少上下文切换。 –

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

从另一个开发人员的代码逆向工程业务规则总是很棘手,尤其是在不了解更广泛的领域。但是,在循环的中心是从program_kpi删除,然后在同一个表中插入一个INSERT。如果在amsprogramid = v_programid上没有匹配的记录,那么你插入一条记录,如果有匹配,那么有效的,你只是更新lastupdatedbydataload与当前SYSDATE。

在其他人看来,它似乎是一个合并的逻辑。所以也许你的代码完全可以用一个语句来代替。如果是这样的话,这可能比游标循环中的逐行激活行处理效率更高。

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_id以及programid上的匹配与在programid上只是删除相同。