2017-04-08 1 views
0

Ich habe ein Feld in einer Tabelle mit 'SMITH, ALLEN, WARD, JONES'. Ich versuche, Zeilen aus der Tabelle mit dem Cursor zu lesen und wenn dieses bestimmte Feld gefunden wird, verwendet regexp_substr, um es mit ',' als Trennzeichen zu teilen. HierPL/SQL-Cursor wird nicht beendet, wenn Nulldaten gefunden werden

ist der Code:

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; 

Ich möchte die Namen getrennt zurückgegeben, so sollte dieser Cursor verlassen nach vier Werte Druck, da nach, dass es Null-Werte zurückgibt. Aber %NOTFOUND Zustand verlässt nicht die Schleife und es bleibt Schleifen. Ich kann das Problem nicht herausfinden.

Antwort

2

Also das Problem ist, dass Ihre Regex-Ausdruck nicht beendet wird. Wie Sie unterstreichen, ruft der Cursor Datensätze mit einem Nullnamen ab.

Eine Möglichkeit wäre, den Test zu ändern, um die Schleife zu verlassen:

if lvar is null then exit; end if; 

Die andere Option ist die Regex zu beheben. Die CONNECT BY Klausel sollte sein:

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

Vielen Dank. Das funktioniert -> wenn lvar null ist, dann exit; Ende wenn; . Der Level-Parameter gibt alle Sätze zurück, aber ich brauche nur einen, das ist der Grund, warum ich mit '1' gegangen bin. – Varghese

Verwandte Themen