Vos données à votre portée avec Salesforce, Python, SQL, & et plus

Need event music? 🎸

Live and recorded jazz, pop, and meditative music for your virtual conference / Zoom wedding / yoga class / private party with quality sound and a smooth technical experience

ORA-29283 salut le monde

05 Oct 2020 🔖 sql bases de données
💬 FR ( Read this post in English )

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.

--- ---