Sedan Oracle 9i finns det två sätt att deklarera en katalog för användning med UTL_FILE.
Det äldre sättet är att ställa in INIT.ORA-parametern UTL_FILE_DIR. Vi måste starta om databasen för att en ändring ska träda i kraft. Värdet kan likna vilken PATH-variabel som helst; den accepterar jokertecken. Att använda detta tillvägagångssätt innebär att skicka katalogsökvägen...
UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');
Det alternativa tillvägagångssättet är att deklarera ett katalogobjekt.
create or replace directory temp_dir as 'C:\temp'
/
grant read, write on directory temp_dir to vineet
/
Katalogobjekt kräver den exakta sökvägen och accepterar inte jokertecken. I detta tillvägagångssätt skickar vi katalogobjektets namn...
UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');
UTL_FILE_DIR är utfasad eftersom den är osäker i sig - alla användare har tillgång till alla OS-kataloger som anges i sökvägen, medan läs- och skrivbehörigheter kan beviljas separat till enskilda användare. Med Directory-objekt kan vi också lägga till, ta bort eller ändra kataloger utan att studsa databasen.
I båda fallen, oracle
OS-användare måste ha läs- och/eller skrivbehörighet i OS-katalogen . Om det inte är uppenbart betyder det att katalogen måste vara synlig från databasservern . Så vi kan inte använda någon av metoderna för att exponera en katalog på vår lokala PC för en process som körs på en fjärrdatabasserver. Filer måste laddas upp till databasservern eller en delad nätverksenhet.
Om oracle
OS-användare har inte lämpliga privilegier på OS-katalogen, eller om sökvägen som anges i databasen inte matchar en faktisk sökväg, kommer programmet att skicka detta undantag:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
OERR-texten för detta fel är ganska tydlig:
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.