下面的代码会持续一段时间。 正如您所看到的,我必须从一个表中获取值并使用该值来检查第二个表是否包含它,并插入第一个表中的第三个表值。 还有其他方法吗?
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 :(得分: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_id
和programid
上的匹配与仅在programid
上删除不同。
答案 1 :(得分:2)
首次提取后,您不会更改v_UDF。然后循环比较它与相同的第一个值...比较和比较...比较和比较。