Sinds Oracle 9i zijn er twee manieren om een directory te declareren voor gebruik met UTL_FILE.
De oudere manier is om de INIT.ORA-parameter UTL_FILE_DIR in te stellen. We moeten de database opnieuw opstarten om een wijziging door te voeren. De waarde kan zoals elke andere PATH-variabele; het accepteert wildcards. Als u deze aanpak gebruikt, moet u het directorypad doorgeven...
UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');
De alternatieve benadering is om een directory-object te declareren.
create or replace directory temp_dir as 'C:\temp'
/
grant read, write on directory temp_dir to vineet
/
Directory-objecten vereisen het exacte bestandspad en accepteren geen jokertekens. In deze benadering geven we de naam van het directory-object door...
UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');
De UTL_FILE_DIR is verouderd omdat het inherent onveilig is - alle gebruikers hebben toegang tot alle OS-directory's die in het pad zijn gespecificeerd, terwijl lees- en schrijfrechten discreet kunnen worden verleend aan individuele gebruikers. Met Directory-objecten kunnen we ook mappen toevoegen, verwijderen of wijzigen zonder de database te stuiteren.
In beide gevallen is het oracle
OS-gebruiker moet lees- en/of schrijfrechten hebben in de OS-directory . In het geval dat het niet duidelijk is, betekent dit dat de directory zichtbaar moet zijn vanaf de databaseserver . We kunnen dus geen van beide benaderingen gebruiken om een map op onze lokale pc bloot te stellen aan een proces dat op een externe databaseserver wordt uitgevoerd. Bestanden moeten worden geüpload naar de databaseserver of een gedeelde netwerkschijf.
Als het oracle
OS-gebruiker heeft niet de juiste privileges voor de OS-directory, of als het pad gespecificeerd in de database niet overeenkomt met een daadwerkelijk pad, zal het programma deze uitzondering weggooien:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
De OERR-tekst voor deze fout is vrij duidelijk:
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.