流不会进入循环

时间:2015-11-05 10:34:32

标签: oracle

下面是PL / SQL。问题是流不会进入循环。我无法弄清楚问题是什么。两个查询都返回结果,即循环中的查询和循环中的查询确实返回结果。

DECLARE
p_file_name VARCHAR2(4000) :='GHCPExtract_100_005_2011052218000700.csv';
v_file_name  VARCHAR2(4000) :='' || '''' || p_file_name ||'''';
v_count NUMBER :=0;
v_loop        NUMBER :=0;


begin
                  DBMS_OUTPUT.PUT_LINE( 'BEFORE LOOP');


FOR C IN (
        SELECT 
S.SOURCE_TRX_KEY_SEGMENT1    ,
S.SOURCE_TRX_KEY_SEGMENT2    ,
S.SOURCE_TRX_KEY_SEGMENT3    ,
S.SOURCE_TRX_KEY_SEGMENT4    ,
S.SOURCE_TRX_KEY_SEGMENT5    ,
S.SOURCE_TRX_KEY_SEGMENT6    
FROM DM_RS.STG_GHCP_EXTRACT S
WHERE S.SOURCE_FILE_NAME = v_file_name

)
LOOP
DBMS_OUTPUT.PUT_LINE( 'IN LOOP');
BEGIN

select 
1
into 
v_count
from

(
select 
T.SOURCE_TRX_KEY_SEGMENT1    ,
T.SOURCE_TRX_KEY_SEGMENT2    ,
T.SOURCE_TRX_KEY_SEGMENT3    ,
T.SOURCE_TRX_KEY_SEGMENT4    ,
T.SOURCE_TRX_KEY_SEGMENT5    ,
T.SOURCE_TRX_KEY_SEGMENT6    
from
GTT_SEGMENT_ID t
WHERE 1=1
AND 
T.SOURCE_TRX_KEY_SEGMENT1 = C.SOURCE_TRX_KEY_SEGMENT1
and
T.SOURCE_TRX_KEY_SEGMENT2 = C.SOURCE_TRX_KEY_SEGMENT2
and
T.SOURCE_TRX_KEY_SEGMENT3 = C.SOURCE_TRX_KEY_SEGMENT3
and
T.SOURCE_TRX_KEY_SEGMENT4 = C.SOURCE_TRX_KEY_SEGMENT4
and
T.SOURCE_TRX_KEY_SEGMENT5 = C.SOURCE_TRX_KEY_SEGMENT5
and 
T.SOURCE_TRX_KEY_SEGMENT6 = C.SOURCE_TRX_KEY_SEGMENT6
and t.source_file_name = v_file_name
);
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        v_count := 0;
    END;

IF (v_count = 1)
THEN
V_LOOP := V_LOOP +1;
END IF;

END LOOP;

                  DBMS_OUTPUT.PUT_LINE( V_LOOP);
   END;

DBMS_OUTPUT

在循环之前

0

1 个答案:

答案 0 :(得分:2)

v_file_name  VARCHAR2(4000) :='' || '''' || p_file_name ||'''';
....
WHERE S.SOURCE_FILE_NAME =  '' || '''' || v_file_name ||''''

表中有多少引号包含SOURCE_FILE_NAME?

您可以使用临时变量检查查询中的计数行 -

SELECT count(1)
 INTO cnt_
 FROM DM_RS.STG_GHCP_EXTRACT S
WHERE S.SOURCE_FILE_NAME =  '''' || v_file_name ||'''';

DBMS_OUTPUT.put_line('rows count: '||cnt_);

另外,检查表中的数据是否已提交并在其他会话中可用。

修改

显然循环中的查询不返回任何行,因为'IN LOOP'不会在输出中打印。

返回此查询的行数是多少? -

SELECT count(1)
  FROM dm_rs.stg_ghcp_extract s
 WHERE s.source_file_name = '' || '''' || 'GHCPExtract_100_005_2011052218000700.csv' || ''''

顺便说一句,如果您只需要比较行数,可以使用EXISTS而不是循环选择一个。

SELECT count(1)
  into v_count
  FROM dm_rs.stg_ghcp_extract c
 WHERE c.source_file_name = v_file_name
   AND EXISTS
          (SELECT 1
             FROM gtt_segment_id t
            WHERE t.source_trx_key_segment1 = c.source_trx_key_segment1
              AND t.source_trx_key_segment2 = c.source_trx_key_segment2
              AND t.source_trx_key_segment3 = c.source_trx_key_segment3
              AND t.source_trx_key_segment4 = c.source_trx_key_segment4
              AND t.source_trx_key_segment5 = c.source_trx_key_segment5
              AND t.source_trx_key_segment6 = c.source_trx_key_segment6
              AND t.source_file_name = c.source_file_name)