PL/SQL WHEN NO_DATA_FOUND [Fermé]

Signaler
-
 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

3 réponses


Change la condition de l'exception en : EXCEPTION WHEN OTHERS THEN et cela fonctionne
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.

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
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