29. oktober 2001 - 08:04Der er
13 kommentarer og 2 løsninger
dbms_lob.write
Jeg har udviklet et program som skal køre på en Oracle server i Oracles job-scheduler dbms_job.
Programmet fungerer og jeg har nu brug for at kunne skrive til logfil hvornår jobbet startede og sluttede og yderligere hvis jobbet fejler et tidspunkt for hvornår og hvilket fejl.
Jeg har lavet nedenstående testprocedure som skal skrive til en fil:
CREATE OR REPLACE PROCEDURE writeDataToFile IS v_file_loc BFILE; v_buffer VARCHAR2(26); v_amount BINARY_INTEGER := 26; v_position INTEGER := 1; i INTEGER;
BEGIN v_file_loc := BFILENAME (\'STOPLIST\', \'TimeLog.log\'); /* Fill the buffer with data to write to the LOB: */ v_buffer := to_char(sysdate);
FOR i IN 1..3 LOOP DBMS_LOB.WRITE (v_file_loc, 30, 1, v_buffer); /* Fill the buffer with more data to write to the LOB: */ v_buffer := to_char(sysdate) || to_char(i); v_position := v_position + v_amount; END LOOP; /* Closing the LOB is mandatory if you have opened it: */ DBMS_LOB.FILECLOSE (v_file_loc); END;
Jeg har oprettet STOPLIST directory.
Når jeg forsøger at kompilere får jeg følgende fejlbesked:
PLS-00306: wrong number or types of arguments in call to \'WRITE\'
Umiddelbart kan jeg ikke se at jeg skal kunne udelade nogle argumenter i dbms_lob.write.
Kan jeg få den til udelukkende til at køre på serveren. Grunden til at jeg spørger er jeg erindrer noget om at man skal ændre i en lokal fil som henviser til den fil man ønsker at læse/skrive til. I alle tilfælde må du meget gerne vise et eksempel på hvorledes man skriver til en fil med UTL_FILE :o) .
FOR i IN 1..3 LOOP DBMS_LOB.WRITE (v_file_loc, 30, 1, v_buffer); /* Fill the buffer with more data to write to the LOB: */ v_buffer := \'Test2\'; v_position := v_position + v_amount; END LOOP; /* Closing the LOB is mandatory if you have opened it: */ DBMS_LOB.FILECLOSE (v_file_loc);
Create or replace procedure write_emp as emp_data UTL_FILE.FILE_TYPE; BEGIN --Open the file emp_data := UTL_FILE.FOPEN (\'C:\\DB_UTL\',\'employees.txt\', \'W\', 4096); --write out empno UTL_FILE.PUT_LINE(emp_data, \'[EMPNO]\'); UTL_FILE.PUT (emp_data, \'EMPNO=\'); for emp in ( select empno from emp) loop UTL_FILE.PUT (emp_data, emp.empno||\'|\'); end loop; UTL_FILE.new_line (emp_data); --Write out a list of employee IDs and names, salary etc. FOR emp IN ( select * FROM emp) LOOP UTL_FILE.PUT_LINE (emp_data, \'********************************\'); UTL_FILE.PUT_LINE (emp_data, \'EMPNO= \'||emp.empno); UTL_FILE.PUT_LINE (emp_data, \'ENAME= \'||emp.ename); UTL_FILE.PUT_LINE (emp_data, \'JOB= \'||emp.JOB); UTL_FILE.PUT_LINE (emp_data, \'MGR= \'||emp.MGR); UTL_FILE.PUT_LINE (emp_data, \'HIREDATE= \'||emp.HIREDATE); UTL_FILE.PUT_LINE (emp_data, \'SAL= \'||emp.SAL);
if emp.comm is not null then UTL_FILE.PUT_LINE (emp_data, \'COMM= \'||EMP.COMM); end if; UTL_FILE.PUT_LINE (emp_data, \'DEPTNO= \'||emp.DEPTNO); UTL_FILE.PUT_LINE (emp_data, \' \'); END LOOP; --Close the file UTL_FILE.FCLOSE (emp_data); end; /
Nej, du skal ikke pille i nogen lokale file, det du tænker på, er nok at du skal rette i INIT.ORA, for at få adgang til at skrive i et givent directory, se evt. nedenstående fra Metalink:
Directory Names ===============
For UTL_FILE\'s procedures to access server directories the directories to be accessed must be specified in the init.ora file, for example :
Create or replace procedure write_emp as emp_data UTL_FILE.FILE_TYPE; v_error_code Number; v_error_message Varchar2(255);
BEGIN --Open the file emp_data := UTL_FILE.FOPEN (\'D:\\ARKIVDREV\\FILES\',\'ErrorLog.log\', \'W\', 4096); --write out empno UTL_FILE.PUT_LINE(emp_data, to_char(sysdate)); UTL_FILE.new_line (emp_data); UTL_FILE.PUT_LINE(emp_data, to_char(sysdate));
--Close the file UTL_FILE.FCLOSE (emp_data);
Exception
When others Then Commit; v_error_code := Sqlcode; v_error_message := Sqlerrm; dbms_output.put_line(\'Fejlkode: \' || to_char(v_error_code)); dbms_output.put_line(\'Fejltekst: \' || v_error_message); end; /
Jeg kan godt kompilere men får følgende fejl når jeg eksekverer:
FEJL i linie 1: ORA-06510: PL/SQL: unhandled user-defined exception ORA-06512: at \"SYS.UTL_FILE\", line 98 ORA-06512: at \"SYS.UTL_FILE\", line 192 ORA-06512: at \"ARKIV.WRITE_EMP\", line 5 ORA-06512: at line 1
Jeg har desværre ikke mulighed for at genstarte databasen i dag.
Men hvad nu når jeg ligger dette I Oracles jobscheduler (dbms_job) hvilken kører udelukkende på serveren - kan den så godt skrive til den angivne sti, når jeg nu kun ændrer init.ora lokalt?
procedure write_emp as emp_data UTL_FILE.FILE_TYPE; v_error_code Number; v_error_message Varchar2(255);
BEGIN --Open the file emp_data := UTL_FILE.FOPEN (\'D:\\ARKIVDREV\\FILES\',\'ErrorLog.log\', \'W\', 4096); --write out empno UTL_FILE.PUT_LINE(emp_data, to_char(sysdate)); UTL_FILE.new_line (emp_data); UTL_FILE.PUT_LINE(emp_data, to_char(sysdate));
--Close the file UTL_FILE.FCLOSE (emp_data);
Exception
When others Then Commit; v_error_code := Sqlcode; v_error_message := Sqlerrm; dbms_output.put_line(\'Fejlkode: \' || to_char(v_error_code)); dbms_output.put_line(\'Fejltekst: \' || v_error_message); end;
Tak for hjælpen!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.