ORA-29283 salut le monde
05 Oct 2020
J’ai reçu récemment un message d’erreur « ORA-29283 » (« opération non valide sur le fichier ») lorsque j’ai fait éxécuter un logiciel Oracle PL/SQL assez long. J’ai trouvé très utile un petit script genre « salut le monde ».
DECLARE
v_file UTL_FILE.file_type;
BEGIN
v_file := UTL_FILE.fopen('NOM_DU_DOSSIER_ORACLE', 'NOM_DU_FICHIER.txt', 'w');
END;
/
En train de transformer le pacquetage Oracle PL/SQL « CSV » de Tim Hall en bloc PL/SQL anonyme, j’ai fait éxécuter sa procédure .generate()
et j’ai reçu une erreur:
ORA-29283: invalid file operation
Le BEGIN
de mon script PL/SQL éxécutait .generate()
ainsi :
generate('nom_du_dossier_oracle', 'nom_du_fichier.csv', p_query => 'SELECT * FROM une_table');
Selon la trace d’appels, le problème était dans le code de Tim suivant :
IF g_out_type = 'F' THEN
l_file := UTL_FILE.fopen(p_dir, p_file, 'w', 32767);
END IF;
Mes collègues et moi, on a essayé d’abord les requêtes SQL suggérées sur Ask Tom :
D’abord, mes collègues ont vérifié l’éxistence du dossier Oracle nom_du_dossier_oracle
:
SELECT *
FROM all_directories
WHERE directory_name = 'nom_du_dossier_oracle';
Après, ils ont vérifié que l’utilisateur Oracle qui éxécutait mon code était assez priviligié en Oracle pour écrire le dossier du système d’exploitation representé par le dossier Oracle nom_du_dossier_oracle
:
SELECT *
FROM all_tab_privs
WHERE table_name = 'nom_du_dossier_oracle'
AND grantee = user
AND grantee = 'the_executing_oracle_username'
AND privilege = 'WRITE';
Tout était valide, alors il fallait explorer la possibilité des problèmes avec le systeme d’exploitation _(comme a été suggéré sur Ask Tom).
A ce point-ci, il a fallu contacter un/e administrateur systèmes // DBA. Pour la permettre de tester l’éxécution de utl_file.fopen()
, j’ai écrit un petit script PL/SQL script de 5 lignes :
DECLARE
v_file UTL_FILE.file_type;
BEGIN
v_file := UTL_FILE.fopen('nom_du_dossier_oracle', 'nom_du_fichier.csv', 'w');
END;
/
Ce petit script a permis l’admin de vérifier l’impacte de ses efforts dans le système d’exploitation sur l’erreur Oracle sans s’inquiéter des détails du code de Tim Hall.