Le premier problème est que le chemin n'existe probablement pas ou que vous n'avez pas de privilèges d'écriture sur le répertoire.
SQL> select directory_path from all_directories where directory_name = 'YOUR DIRECTORY' ;
Si vous n'avez aucune ligne, vous devez résoudre ce problème avec votre administrateur de base de données, car soit le répertoire n'existe pas, soit vous n'avez aucun privilège dessus. Un répertoire de base de données est une combinaison de deux éléments :
- Le répertoire de la base de données est un pointeur ou une référence à un emplacement dans le système d'exploitation.
- Le chemin de ce répertoire doit exister et l'utilisateur qui exécute le processus doit posséder des privilèges de lecture et d'écriture sur celui-ci.
Pour le deuxième problème, le problème est que l'utilisateur propriétaire de la procédure n'a pas reçu le privilège système CREATE ANY DIRECTORY. Votre administrateur de base de données doit accorder le privilège CREATE ANY DIRECTORY à votre utilisateur, bien que je ne le recommande pas. Accorder N'IMPORTE QUEL privilège est une mauvaise pratique de sécurité.
La création de répertoires est normalement une tâche pour votre DBA. Je ne prévois pas de scénario dans lequel vous devez les créer dynamiquement, tant que vous devez également créer le répertoire sous-jacent dans le système de fichiers (Linux) ou le lecteur Windows, en fonction de votre système d'exploitation.
Compte tenu de votre situation particulière, vous n'avez pas le choix. Vous devez réévaluer la solution. Peut-être pourriez-vous utiliser WRITETOCLOB au lieu de WRITETOFILE , puis spooler le résultat côté client par sqlplus à la place