PL/SQL WHEN NO_DATA_FOUND
Apside10
-
sgueye -
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
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
A voir également:
- Ora-06502: pl/sql : erreur numérique ou erreur sur une valeur: tampon de chaîne de caractères trop petit
- Replace and strike any key when ready traduction - Forum Windows 7
- Non-System disk or disk error au démarrage ✓ - Forum Disque dur / SSD
- No system disk or disk error replace and strike any key when ready - Forum Windows 7
- When raid configuration was built ensure to set sata configuration to raid mode - Forum BIOS
- Called runscript when not marked in progress - Forum Logiciels
3 réponses
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
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
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.