sql - læsning og skrivning af tekstfiler ved hjælp af UTL\_FILE-pakken eksternt

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at læse og skrive filer ved hjælp af utl\_file-pakken eksternt, men orakelserveren kan ikke læse og skrive på anden pc, så jeg laver en delt sti på \\ adel-pc \ test ', og jeg vil læse og skrive på den vej, men jeg får denne fejl ved læsning:


SQL Error [29283] [99999]: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL\_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 8

  java.sql.SQLException: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL\_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 8


og denne fejl ved skrivning:


SQL Error [29283] [99999]: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL\_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7

  java.sql.SQLException: ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL\_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7


og dette er min kode:


CREATE OR REPLACE DIRECTORY utl\_test AS '\10.10.60.11	est'; 




-- reading the file
DECLARE 
p\_dir varchar2(2000):='UTL\_TEST';
p\_file\_name varchar2(2000):='IFD18021801IFEEDTL'; --file name
l\_file UTL\_FILE.file\_type; 
l\_text varchar2(32767);
begin
l\_file := UTL\_FILE.fopen(p\_dir,p\_file\_name,'r');

LOOP
UTL\_FILE.get\_line(l\_file,l\_text);
DBMS\_OUTPUT.put\_line(l\_text);
END LOOP;

UTL\_FILE.fclose(l\_file);

EXCEPTION
WHEN UTL\_FILE.invalid\_operation THEN dbms\_output.PUT\_LINE('cannot open file invalid name');
WHEN UTL\_FILE.read\_error THEN dbms\_output.PUT\_LINE('cannot be read');
WHEN no\_data\_found THEN dbms\_output.PUT\_LINE('end of file');

UTL\_FILE.fclose(l\_file);
END;




--writing the file
declare 
l\_file UTL\_FILE.file\_type;
l\_location varchar2(100) := 'UTL\_TEST'; -- capital latter
l\_filename varchar2(100) := 'am';

begin
l\_file := UTL\_FILE.fopen(l\_location,l\_filename,'w');

FOR i IN (SELECT * FROM hr.EMPLOYEES)
LOOP
UTL\_FILE.PUT\_LINE(l\_file,i.EMPLOYEE\_ID||'     '||i.FIRST\_NAME);
END LOOP;
UTL\_FILE.fclose(l\_file);

l\_file := UTL\_FILE.fopen(l\_location,l\_filename,'A');
UTL\_FILE.PUT\_LINE(l\_file,'Additonal lines');
UTL\_FILE.fclose(l\_file);

END;


så mine spørgsmål er:



  • Kan jeg skrive og læse på den delte sti, eller det kan ikke gøres ved hjælp af utl\_file?

  • Hvorfor får jeg denne fejl ved at vide, at jeg gav læst & skriv tilladelser til den pågældende sti.


Bedste reference


Jeg foreslår, at du ikke gør det på den måde.


Først og fremmest skaber du den procedure i SYS-skema, hvilket generelt er en dårlig ide. Lad SYS (og SYSTEM) være alene: Opret din egen bruger, giv det nødvendige privilegier (CREATE SESSION, CREATE PROCEDURE og andre du kan kræve), tilslut den og skriv derefter den kode, du vil have.


Hvorfor opretter du mapper dynamisk ? Det er et engangsarbejde og skal gøres en gang, der er forbundet som SYS. Selv om du måske har oprettet disse mapper (det er en god ide at først DBMS\_OUTPUT.PUT\_LINE kommandere du 'er ved at udføre, sørg for at den er korrekt skrevet og da rent faktisk kører den), du gjorde giver ikke READ eller WRITE privilegier på dem til nogen, så - ingen kan bruge dem, men SYS og - som jeg har sagt ovenfor - bruger ikke SYS til det.


Bemærk, at jeg ikke taler om operativsystem privilegier, men Oracle dem, f.eks.


grant read, write on directory some\_dir to scott;


Endelig, når du opretter en mappe på en computer, der ikke er ikke , skal du bruge UNC (Universal Naming Convention) og oprette en mappe bogstaveligt som \adel-pc est; det virker ikke, hvis du folder den mappe på serveren og bruger dens drevbogstav .


Som følge af fejlen selv, huh ... du skrev flere hundrede kodeord, det er lidt for meget til at debug bare ved at se på det, og vi savner andre objekter, du bruger. Ingen anelse, undskyld.

Andre referencer 1


Endelig problemet er løst, problemet var i Windows system privilegier, jeg var nødt til at give fuld kontrol tilladelser til filerne, så ja jeg kan skrive og læse på den delte sti ved hjælp af utl\_file.