2015-11-05 2 views
0

Ниже приведен 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

ПЕРЕД LOOP

+0

, что делает 'выбрать source_file_name из dm_rs.stg_ghcp_extract, где нижний (source_file_name) как '% ghcpextract_100_005_2011052218000700.csv%';' вернуться? – Boneist

+0

source_file_name. i.e source_file_name - это входной параметр, такой как ghcpextract_100_005_2011052218000700.csv –

+0

Вы действительно выполнили запрос, который я предложил, или вы просто догадываетесь? Я спрашиваю, потому что я был бы очень удивлен, если имя файла хранится в таблице с одинарными кавычками вокруг него. Это объясняет, почему ваш код не может войти в цикл. Кроме того, какова цель этого кода? Это просто учебное упражнение, или вы пытаетесь что-то сделать с возвращенными данными? Похоже, вы делаете очень странный (не говоря уже о медленном) способе тестирования, существует ли строка в другой таблице или нет. Но что вы будете делать с полученной информацией? – Boneist

ответ

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_); 

Кроме того, проверьте, что данные в таблице поручены и доступны в другой сессии.

EDIT:

Очевидно, что запрос в цикле не возвращает ни одной строки, потому что 'IN LOOP' не печатается на выходе.

Сколько строк возвращает этот запрос? -

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

Btw, если вам нужно рассчитывать только сравниваемых строк вы можете использовать один выбрать с 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) 
+0

Только два. Приносим извинения за неудобства. Я исправил свой вопрос. И мне нужно значение из цикла для того, чтобы сравнить их со значениями 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 запроса внутри цикла. Если совпадение найдено, тогда выбор будет возвращен как 1 и 1 будет сохранен в v_count, который используется в условии IF в цикле –

+0

Благодарим вас за ваше время и советы. :) –

Смежные вопросы