代码无法正常工作。它需要一个永恒的运行
问题描述:
下面的代码运行永恒。 正如你所看到的,我必须从一个表中取值,并使用该值来检查第二个表是否包含它,并从第一个表中插入到第三个表中。 有没有其他方法可以做到这一点?代码无法正常工作。它需要一个永恒的运行
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;
答
第一次提取后,您不会更改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
上只是删除相同。
你需要显示一些样本数据和所需的结果。无法从您的代码中推断出这一点。 – Noel
这个表达式是多余的,可能是错误的:'v_count不为空或v_count 0' - 如果v_count不为空,前面的查询保证它不为零。为什么不简单使用'v_count> 0'? –
从性能角度看,您应该将'vw_ticket'上的子查询合并到游标查询中,以减少所需的工作量,并减少上下文切换。 –