Od Oracle 9i existují dva způsoby, jak deklarovat adresář pro použití s UTL_FILE.
Starší způsob je nastavení parametru INIT.ORA UTL_FILE_DIR. Aby se změna projevila, musíme restartovat databázi. Hodnota se může podobat jakékoli jiné proměnné PATH; přijímá zástupné znaky. Použití tohoto přístupu znamená předání cesty k adresáři...
UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');
Alternativním přístupem je deklarace objektu adresáře.
create or replace directory temp_dir as 'C:\temp'
/
grant read, write on directory temp_dir to vineet
/
Objekty adresáře vyžadují přesnou cestu k souboru a nepřijímají zástupné znaky. V tomto přístupu předáme název objektu adresáře...
UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');
UTL_FILE_DIR je zastaralý, protože je ze své podstaty nezabezpečený – všichni uživatelé mají přístup ke všem adresářům OS zadaným v cestě, zatímco oprávnění ke čtení a zápisu mohou být jednotlivým uživatelům udělena diskrétně. Pomocí objektů Directory můžeme také přidávat, odebírat nebo měnit adresáře, aniž by došlo k opuštění databáze.
V obou případech oracle
Uživatel OS musí mít oprávnění pro čtení a zápis v adresáři OS . V případě, že to není zřejmé, znamená to, že adresář musí být viditelný z databázového serveru . Nemůžeme tedy použít ani jeden přístup k vystavení adresáře na našem lokálním PC procesu běžícímu na vzdáleném databázovém serveru. Soubory musí být nahrány na databázový server nebo sdílený síťový disk.
Pokud oracle
Uživatel OS nemá příslušná oprávnění k adresáři OS nebo pokud cesta zadaná v databázi neodpovídá skutečné cestě, program vyvolá tuto výjimku:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
Text OERR pro tuto chybu je celkem jasný:
29283 - "invalid file operation"
*Cause: An attempt was made to read from a file or directory that does
not exist, or file or directory access was denied by the
operating system.
*Action: Verify file and directory access privileges on the file system,
and if reading, verify that the file exists.