Bonjour,
Y'a t-il une exception pour trapper le fait que le fichier qui est lié à une external table est absent?
Je voudrais trapper ce genre d'erreur.
merci
Bonjour,
Y'a t-il une exception pour trapper le fait que le fichier qui est lié à une external table est absent?
Je voudrais trapper ce genre d'erreur.
merci
A la création tu n'auras pas d'erreur mais au premier select tu auras :
Voila en espérant avoir répondu à la question
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 select * from IDB.sga_tst * ERREUR à la ligne 1 : ORA-29913: erreur d'exécution de l'appel ODCIEXTTABLEOPEN ORA-29400: erreur de cartouche de données KUP-04040: fichier sga_tst.TXT introuvable dans DATA_DIR ORA-06512: à "SYS.ORACLE_LOADER", ligne 14 ORA-06512: à ligne 1
donc je ne peux pas trapper à la creation...
mais pour trapper ce genre de select :
l'exception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 select * from IDB.sga_tst * ERREUR à la ligne 1 : ORA-29913: erreur d'exécution de l'appel ODCIEXTTABLEOPEN ORA-29400: erreur de cartouche de données KUP-04040: fichier sga_tst.TXT introuvable dans DATA_DIR ORA-06512: à "SYS.ORACLE_LOADER", ligne 14 ORA-06512: à ligne 1
WHEN ??? THEN
???
merci
A priori le sqlcode nous retourne l'erreur -29913, cependant en fesant une recherche dans sqlerrm mais c'est pas folichon !!
Sinon personne ne serait comment récupérer l'erreur KUP-04040 plus proprement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 declare ws pls_integer; begin select count(*) into ws from IDB.sga_tst ; exception when others then if instr(sqlerrm,'KUP-04040')>1 then dbms_output.put_line ('Fichier non trouvé!'); end if; end;
Je vais essayer ca merci... mais j'avoue que c'est pas tres clean...
Si y'a quelqu'un qui a une idée plus clean... ce serait apprécié
N'oublie quand meme pas de faire un RAISE dans les autres cas parceque là tu est entrain d'ignorer toutes les autres exceptions!
Je viens d'essayer ca mais dans mon cas, le nom de la table externe est passer en parametre ce qui fait que je dois faire
mais le probleme c'est qu'il ne trappe plus l'erreur... y'aurait-il un moyen que je fasse un select en lui passant la table en parametre... avec un curseur dynamique je ne sais pas pourquoi il plante et ne trappe pas l'erreur... c'est peut-etre pas la meme... je ne sais pas. Y'a quelqu'un qui a une idée?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2execute immediate 'select 1 from '||p_nom_table;
Je t'ai donner une EXEMPLE, a toi de l'adapter , de plus notre ami remi4444 t'a donner la réponseEnvoyé par juin29
Envoyé par remi4444
Tiens nous au courant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 declare ws pls_integer; p_nom_table varchar2(50) := 'IDB.ide_cb'; begin --select count(*) into ws from IDB.sga_tst ; execute immediate 'select count(*) from '||p_nom_table into ws; exception when others then if instr(sqlerrm,'KUP-04040')>1 then dbms_output.put_line ('Fichier non trouvé!'); else dbms_output.put_line (sqlerrm); raise; end if; end;
ce que je veux dire c'est qu'en faisant le select avec un execute immédiate, l'erreur n'est plus trappé... il ne passe plus dans l'exception when others que nous avons spécifié. Le select passe tout droit mais pourtant il ne se rend pas à mon dbms apres, il n'écrit pas mon "hello" donc il a planté.
Est-ce qu'il y a un autre moyen pour exécuter un select dynamique pour qu'il passe dans l'exception...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 BEGIN EXECUTE IMMEDIATE 'select count(1) from '||t#extern_table_name ; dbms_output.put_line('HELLO'); EXCEPTION WHEN OTHERS THEN IF INSTR(SQLERRM,'KUP-04040')>1 THEN dbms_output.put_line('err1'); ELSE dbms_output.put_line('err2'); END IF; END;
Le problème est lié aux:
1- Placement du Directory: Le répertoire "DATA_DIR" doit etre impérativement sur le même serveur que la base de données sinon il faut donner le path complet de l’hôte contenant le répertoire.
2- Droits d'accès sur le fichier: Ajoute les autorisations sur le fichier pour les autres (others) 707 est suffisant (N.B: Si besoin de read uniquement donc 704/604 suffit).
ERREUR à la ligne 1 :
ORA-29913: erreur d'exécution de l'appel ODCIEXTTABLEOPEN : lié surtout au deuxième point
ORA-29400: erreur de cartouche de données
KUP-04040: fichier sga_tst.TXT introuvable dans DATA_DIR
ORA-06512: à "SYS.ORACLE_LOADER", ligne 14
ORA-06512: à ligne 1
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager