create or replace procedure data_quality_check( inface_id number default null) is
v_src_clmn varchar2(400);
v_tgt_clmn varchar2(400);
v2_src_value varchar2(400);
date_chk varchar2(200);
v2_primary_key varchar2(400);
CURSOR cur_1 is select temp_field_name,dest_field_name,transform_function from BUNTERFACETEMP_TO_DEST where BUNTERFACEID = inface_id;
c_curr1 cur_1%ROWTYPE;
/* Second cursor */
TYPE cur_typ IS REF CURSOR;
cur_2 cur_typ;
begin
execute immediate 'truncate table BUNTERFACEDATA_QLTY_CHK';
open cur_1;
loop
FETCH cur_1 INTO v_src_clmn,v_tgt_clmn,date_chk;
if date_chk = 'bingle.txt2dt' OR date_chk = 'bingle.txt2dtf1' OR date_chk = 'bingle.txt2dtf2' OR date_chk = 'bingle.txt2dtf3' then
-- Open second cursor
OPEN cur_2 for 'SELECT C2,' || v_src_clmn || ' from CAT_TEMP_MED' ;
LOOP
FETCH cur_2 INTO v2_primary_key,v2_src_value;
EXIT when cur_1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ( v_src_clmn || '-' || v2_src_value || inface_id || date_chk);
Insert into BUNTERFACEDATA_QLTY_CHK(pk_key,temp_field_name,BUNTERFACEID,DEST_FIELD_NAME,VALUE,ERROR,date_loaded) values (v2_primary_key,
v_src_clmn,inface_id,v_tgt_clmn,v2_src_value,'GOOD ROW',sysdate);
IF v2_src_value is NULL then
Insert into BUNTERFACEDATA_QLTY_CHK(pk_key,temp_field_name,BUNTERFACEID,DEST_FIELD_NAME,VALUE,ERROR,date_loaded) values (v2_primary_key,
v_src_clmn,inface_id,v_tgt_clmn,v2_src_value,'NULL VALUE',sysdate);
commit;
exit;
end if;
EXIT when cur_2%NOTFOUND;
END LOOP;
CLOSE cur_2;
end if;
end loop;
close cur_1;
end;
在上面的游标中,只要遇到空值,光标就会退出。 它是什么原因? 我从早上起就为此苦苦挣扎 任何替代解决方案
上面的代码从表BUNTERFACETEMP_TO_DEST中获取列名,然后验证列值是否为null。 它是否为将数据插入表中为空,但我看到的是一旦遇到循环退出就会出现。
答案 0 :(得分:0)
你在循环中有一个早期的无条件exit
:
LOOP
...
IF v2_src_value is NULL then
Insert into BUNTERFACEDATA_QLTY_CHK ...;
commit;
**exit;**
end if;
第一次循环遇到null时,代码将退出循环。