PL/SQL WHEN NO_DATA_FOUND

Apside10 -  
 sgueye -
Bonjour,

Voici un programme PL/SQL plutot simple pour les besoins d'une formation.

DECLARE

v_id_oi oi.oi_id_oi%type;
g_result number;

BEGIN
select oi_id_oi into v_id_oi from oi where oi_id_oi = 19;
:g_result := 1;
DBMS_OUTPUT.PUT_LINE('g_result1 = ' || :g_result);

EXCEPTION
WHEN NO_DATA_FOUND THEN
begin
:g_result := 2;
DBMS_OUTPUT.PUT_LINE('g_result2 = ' || :g_result);
End;

END ;

Lorsque j'execute ce programme, et que la requête ne retourne aucune donnée, la variable g_result reste inexorablement positionné a NULL. Pourtant WHEN NO_DATA_FOUND est bien executé puisque le texte 'g_result2' est bien afifché.

Lorsque la requête retourne une valeur, g_result1 = 1 est bien affiché.

No comprendo...une piste, une idée ?
merci d'avance
Configuration: Windows XP
Internet Explorer 6.0

3 réponses

  1. Utilisateur anonyme
     
    Change la condition de l'exception en : EXCEPTION WHEN OTHERS THEN et cela fonctionne
    0
    1. Apside10
       
      J'ai omis un détail important

      Si j'execute ce programme via une ligne de commande sql*plus, il s'execute correctement. (Le message géré dans le NO_DATA_FOUND s'affiche bien)

      Toutefois Je travaille sous SQL Developer (version free proposer par Oracle) pour les besoins de la formation
      Si j'execute ce programme via SQL Developer, cela ne fontionne pas.
      le WHEN OTHER ne change rien au phénomène.
      0
  2. Utilisateur anonyme
     
    Bizarre car sous TOAD cela fonctionne avec le WHEN OTHERS et pas le NO_DATA_FOUND. J'ai l'impression que les éditeurs interprètent différents les codes d'erreurs :-S
    0
  3. sgueye
     
    Juste initialiser le g_result

    DECLARE
    v_id_oi oi.oi_id_oi%type;
    g_result number := 0; --ici avant de l'utiliser
    BEGIN
    select oi_id_oi into v_id_oi from oi where oi_id_oi = 19;
    :g_result := 1;
    DBMS_OUTPUT.PUT_LINE('g_result1 = ' || :g_result);
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    begin
    :g_result := 2;
    DBMS_OUTPUT.PUT_LINE('g_result2 = ' || :g_result);
    End;
    END ;

    En effet :g_result := 1; ne se fait que si la requête se passe bien. Ce n'est pas une initialisation

    Cordialement
    0