附件中就是我的源代码,创建过程成功,执行也成功,但是没有任何输出(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 的操作权的了

解决方案 »

  1.   

    to hongqi162:这个oracle管理文件夹是作什么用的??要怎么设置呢??不好意思,我是新手,麻烦讲的详细些,谢谢!!
      

  2.   

     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;
      

  3.   

    这是在windows下oracle的例子,注意这是9i以上的。同时注意授权
      

  4.   

    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
      

  5.   

    谢谢大家的鼎立帮忙,不过我这里还是有点不是很明白:
    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系统下的,会和这个有关系吗??
      

  6.   

    FOPEN 会抛出以下异常
    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;
      

  7.   

    呵呵,可以正常输出了,如果将输出路径定义到服务器端就可以,但是如果输出路径定义到本机就无法输出,是和我服务器是unix系统有关吗??有解决的办法吗??
    麻烦大家再帮帮忙,谢谢咯~~~~~
      

  8.   


    在ini <sid>.ora文件里添加: 
    utl_file=e:/work 
    就是添加個utl有權限操作的文件路徑,當然要在服務器端定義了,
    要讀寫文件也必須上傳到服務器上。