当列中存在空值时,为什么光标会退出

时间:2016-09-15 06:52:43

标签: plsql

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。 它是否为将数据插入表中为空,但我看到的是一旦遇到循环退出就会出现。

1 个答案:

答案 0 :(得分:0)

你在循环中有一个早期的无条件exit

LOOP
  ...
    IF v2_src_value is NULL then 
       Insert into BUNTERFACEDATA_QLTY_CHK ...;
       commit; 
       **exit;**
    end if;

第一次循环遇到null时,代码将退出循环。