2017-04-08 5 views
0

'SMITH、ALLEN、WARD、JONES'を含む表にフィールドがあります。私はカーソルを使用してテーブルから行を読み込もうとしています。この特定のフィールドが見つかったら、区切り文字として','を使用してそれを分割するためにregexp_substrを使用しました。ここでnullデータが見つかったときにPL/SQLカーソルが終了しない

コードです:

PROCEDURE x26837a_dummy IS 
    CURSOR d_cursor IS 
    SELECT regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) 
     FROM x26837a_dummy_table 
    CONNECT BY regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, 1) IS NOT NULL 
    lvar VARCHAR2(128) := ''; 
    BEGIN 
    OPEN d_cursor; 
    LOOP 
     FETCH d_cursor 
     INTO lvar; 
     EXIT WHEN d_cursor%NOTFOUND; 
     DBMS_OUTPUT.PUT_LINE(lvar); 
    END LOOP; 
    CLOSE d_cursor; 
    END x26837a_dummy; 

私は名前が個別に返さので、このカーソルは後に、それはNULL値を返すことから、4つの値を印刷した後に終了する必要がありたいと思います。しかし、%NOTFOUND条件はループを終了せず、ループを維持します。問題を理解していないようです。

答えて

2

正規表現が終了しないという問題があります。あなたが指摘しているように、カーソルはヌルの「名前」を持つレコードをフェッチし続けます。

1つのオプションは、ループを終了するためにテストを変更するには、次のようになります。

if lvar is null then exit; end if; 

他のオプションは、正規表現を修正することです。 CONNECT BY句は:

CONNECT BY regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) IS NOT NULL; 
    -- change this ------------------------------------------------^ 
+0

ありがとうございます。これは、lvarがnullで終了した場合に動作します。終了する。 。レベルパラメータはすべてのセットを返しますが、私は1つしか必要ありません、それが私が '1'で行った理由です。 – Varghese

関連する問題