2017-04-08 4 views
0

J'ai un champ dans un tableau contenant 'SMITH, ALLEN, WARD, JONES'. J'essaie de lire les lignes de la table en utilisant le curseur et quand ce champ particulier est trouvé, utilisé regexp_substr pour le diviser en utilisant ',' comme délimiteur.Le curseur PL/SQL ne se ferme pas lorsque des données nulles ont été trouvées

Voici le 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; 

Je veux les noms retournés séparément, de sorte que ce curseur doit quitter après l'impression quatre valeurs, car après qu'elle renvoie des valeurs NULL. Mais la condition %NOTFOUND ne quitte pas la boucle et continue à boucler. Je n'arrive pas à comprendre le problème.

Répondre

2

Donc, le problème est que votre expression regex ne se termine pas. Comme vous le signalez, le curseur continue de récupérer les enregistrements avec un "nom" nul.

Une option serait de modifier le test pour sortir de la boucle:

if lvar is null then exit; end if; 

L'autre option est de fixer le regex. La clause CONNECT BY doit être:

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

Merci beaucoup. Cela fonctionne-> si lvar est nul puis quitte; fin si; . Le paramètre level retourne tous les sets mais je n'en ai besoin que d'un, c'est la raison pour laquelle je suis passé à '1'. – Varghese