当前位置: 代码迷 >> Oracle管理 >> 关于utl_file.fopen,该如何处理
  详细解决方案

关于utl_file.fopen,该如何处理

热度:441   发布时间:2016-04-24 05:44:57.0
关于utl_file.fopen
附件中就是我的源代码,创建过程成功,执行也成功,但是没有任何输出(user表中是有数据的),单步调测发现,当程序运行到l_file :=utl_file.fopen('ZJ_TEST_DIRECTORY','test.xls','W'); 时下一步就会调到EXCEPTION,当运行到IF utl_file.is_open(l_file) THEN 是即跳出if语句,查看变量l_file没有值输出,这是不是说明utl_file.fopen没有执行成功??这是什么原因呢??是我程序哪里有问题吗??

注明:
建立这个过程的用户,已经通过grant execute on utl_file to ...授权了UTL_FILE 的操作权的了

------解决方案--------------------
SQL code
 declare           -- Create or replace directory UCE_DIR  AS 'D:\UCEDATA\FILEDIR\';           -- GRANT  ALL ON DIRECTORY UCE_DIR to TESTUSER;           Fileid   UTL_FILE.file_type;           l_line   VARCHAR2 (32767);           L_EOF    BOOLEAN;        BEGIN           ---1)Test writing file           -- w means Rewrite the file,A means append the file           fileid := UTL_FILE.fopen ('UCE_DIR', 'TUSER.TXT', 'W');           FOR emprec IN (SELECT rownum,RPAD(userid,12,' ') USERID,name UNAME FROM TUSER)           LOOP              l_line:=RPAD(to_char(emprec.rownum),6,' ')||' '||emprec.userid||'    '||emprec.UNAME;              UTL_FILE.putf(fileid,'%s',l_line);  --like C language printf ,here f means five stirng parameters              utl_file.new_line(fileid);                   --This following row does the same as the two rows upon.              --Utl_File.put_line(fileid,l_line);           END LOOP;           UTL_FILE.fclose (fileid);           --2)Test Reading file           fileid :=utl_file.fopen('UCE_DIR', 'TUSER.TXT', 'R');           begin             LOOP               UTL_FILE.get_line (fileid, l_line);               DBMS_OUTPUT.put_line(l_line);             END LOOP;           exception             WHEN NO_DATA_FOUND THEN              UTL_FILE.fclose (fileid);           end;           --3)Test with clob        end;
------解决方案--------------------
oracle 9i:
alter system set utl_file_dir='e:/work' scope=spfile;
在ini<sid>.ora文件里添加:
utl_file=e:/work
GRANT EXECUTE ON utl_file TO system;

oracle 10g :
create or replace directory UTL_FILE_DIR as '/home/oracle/smb';
GRANT EXECUTE ON utl_file TO system;
GRANT READ,WRITE ON OTL_FILE TO SYSTEM;

show parameter utl_file_dir