Първият проблем е, че вероятно пътят не съществува или нямате привилегии за писане в директорията.
SQL> select directory_path from all_directories where directory_name = 'YOUR DIRECTORY' ;
Ако нямате редове, трябва да адресирате това с вашия DBA, тъй като или директорията не съществува, или нямате привилегии над нея. Директория на база данни е комбинация от два елемента:
- Директорията на базата данни е указател или препратка към местоположение в операционната система.
- Пътят на тази директория трябва да съществува и потребителят, който изпълнява процеса, трябва да притежава привилегии за четене и запис в нея.
За втория проблем проблемът е, че потребителят, който притежава процедурата, не е получил системната привилегия CREATE ANY DIRECTORY. Вашият DBA трябва да предостави привилегията CREATE ANY DIRECTORY над вашия потребител, въпреки че не го препоръчвам. Даването на ВСЯКАКВИ привилегии е лоша практика за сигурност.
Създаването на директории обикновено е задача за вашия DBA. Не предвиждам сценарий, когато трябва да ги създадете динамично, стига да трябва да създадете и основната директория във файловата система (Linux) или Windows устройство, в зависимост от вашата операционна система.
Предвид вашите специални обстоятелства, нямате избор с това. Трябва да преоцените решението. Може би бихте могли да използвате WRITETOCLOB вместо WRITETOFILE, след това да спулирате резултата от страната на вашия клиент от sqlplus вместо това