附件中就是我的源代码,创建过程成功,执行也成功,但是没有任何输出(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 的操作权的了
建立这个过程的用户,已经通过grant execute on utl_file to ...授权了UTL_FILE 的操作权的了
-- 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;
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
to dobetterthatnthink:你的这段程序在本机上运行过吗??单步执行呢??到fileid := UTL_FILE.fopen ('UCE_DIR', 'TUSER.TXT', 'W');后程序会跳转到哪里执行??
因为我看你的程序和我的思路差不多,我先在sysdba用户下Create or replace directory ZJ_TEST_DIRECTORY AS ... 然后 grant all ON DIRECTORY ZJ_TEST_DIRECTORY to PHSHOME,grant execute on utl_file to phshome进行授权;接下来在phshome用户下建立并调测过程代码(如附件);exec 这个过程是成功的,但是在路径所指补录下没有文件生成,单步调测,发现当程序运行到l_file :=utl_file.fopen('ZJ_TEST_DIRECTORY','test.xls','W'); 时下一步就会调到EXCEPTION,当运行到IF utl_file.is_open(l_file) THEN 时即跳出if语句,查看变量l_file没有值输出。
这到底是什么原因呢??还有你说你的例子是在windows下oracle的例子,我的oracle是安装在unix系统下的,会和这个有关系吗??
UTL_FILE.INVALID_MODE
UTL_FILE.INVALID_OPERATION
UTL_FILE.INVALID_PATH
UTL_FILE.INVALID_MAXLINESIZE
打开文件时注意以下几点:
文件路径和文件名合起来必须表示操作系统中一个合法的文件。
文件路径必须存在并可访问;FOPEN并不会新建一个文件夹。
如果你想打开文件进行读操作,文件必须存在;如果你想打开文件进行写操作,文件不存在时,会新建一个文件。
如果你想打开文件进行附加操作,文件必须存在。A模式不同于W模式。文件不存在时,会抛出INVALID_OPERATION异常。
UTL_FILE.IS_OPEN用法
如果文件句柄指定的文件已打开,返回TRUE,否则FALSE
FUNCTION UTL_FILE.IS_OPEN (file IN UTL_FILE.FILE_TYPE) RETURN BOOLEAN;
麻烦大家再帮帮忙,谢谢咯~~~~~
在ini <sid>.ora文件里添加:
utl_file=e:/work
就是添加個utl有權限操作的文件路徑,當然要在服務器端定義了,
要讀寫文件也必須上傳到服務器上。