已创建目录:OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ------------------------------ ------------------------------
SYS                            ELE                            D:\wir\ele
SYS                            LEG                            D:\wir\leg存储过程中:
声明
v_file_handle_1 utl_file.file_type;报错
PLS-00201:必须声明标识符‘UTL_FILE’

解决方案 »

  1.   

    你是否有utlfile.sql 包啊? 如果没有当然不能引用包来定义TYPE
    你查看下你的{ORACLE_HOME}/rdbms/admin/utlfile.sql 是否含有此包
      

  2.   

    还有,utl_file内置程序包只能运行在数据库服务端。且utl_file_dir指定为*
    你查看下你init.ora文件中是否加入了 utl_file_dir=*  添加了之后才可以读取服务器上的任何目录。
      

  3.   

    还有 ,当前用户是否有执行utl_file包的权限啊,没有就要登录SYS给用户赋权限才能用
      

  4.   


    使用
    grant read, write on directory LEG to scott;
    grant read, write on directory ELE to scott;貌似没改过来呢
    用DBA权限登录也一样报错
      

  5.   


    GRANT   EXECUTE   ON   utl_file   TO   scott; 你都有对 ELE和LEG进行读写的权限了,应该没问题了啊!
      

  6.   


    --这个是从网上看到的,你按这个步骤试下
    http://ndr666.blog.163.com/blog/static/152991022009103043134903/Create directory让我们可以在Oracle数据库中灵活的对文件进行读写操作,极大的提高了Oracle的易用性和可扩展性。
    其语法为:
    CREATE [OR REPLACE] DIRECTORY directory AS 'pathname';本案例具体创建如下:create or replace directory exp_dir as '/tmp';
    目录创建以后,就可以把读写权限授予特定用户,具体语法如下:
    GRANT READ[,WRITE] ON DIRECTORY directory TO username;例如:grant read, write on directory exp_dir to eygle;
    此时用户eygle就拥有了对该目录的读写权限。让我们看一个简单的测试:SQL> create or replace directory UTL_FILE_DIR as '/opt/oracle/utl_file';
    Directory created.SQL> declare
      2    fhandle utl_file.file_type;
      3  begin
      4    fhandle := utl_file.fopen('UTL_FILE_DIR', 'example.txt', 'w');
      5    utl_file.put_line(fhandle , 'eygle test write one');
      6    utl_file.put_line(fhandle , 'eygle test write two');
      7    utl_file.fclose(fhandle);
      8  end;
      9  /PL/SQL procedure successfully completed.SQL> !
    [oracle@jumper 9.2.0]$ more /opt/oracle/utl_file/example.txt
    eygle test write one
    eygle test write two
    [oracle@jumper 9.2.0]$
     
    类似的我们可以通过utl_file来读取文件:SQL> declare
      2    fhandle   utl_file.file_type;
      3    fp_buffer varchar2(4000);
      4  begin
      5    fhandle := utl_file.fopen ('UTL_FILE_DIR','example.txt', 'R');
      6 
      7    utl_file.get_line (fhandle , fp_buffer );
      8    dbms_output.put_line(fp_buffer );
      9    utl_file.get_line (fhandle , fp_buffer );
     10    dbms_output.put_line(fp_buffer );
     11    utl_file.fclose(fhandle);
     12  end;
     13  /
    eygle test write one
    eygle test write twoPL/SQL procedure successfully completed.
    可以查询dba_directories查看所有directory.SQL> select * from dba_directories;OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
    ------------------------------ ------------------------------ ------------------------------
    SYS                            UTL_FILE_DIR                   /opt/oracle/utl_file
    SYS                            BDUMP_DIR                      /opt/oracle/admin/conner/bdump
    SYS                            EXP_DIR                        /opt/oracle/utl_file可以使用drop directory删除这些路径.SQL> drop directory exp_dir;Directory droppedSQL> select * from dba_directories;OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
    ------------------------------ ------------------------------ ------------------------------
    SYS                            UTL_FILE_DIR                   /opt/oracle/utl_file
    SYS                            BDUMP_DIR                      /opt/oracle/admin/conner/bdump
      

  7.   

    还有,UTL_FILE_DIR参数有大小写区分的,检查下你的目录名的大小写是否与实际路径名相符,大小写都一样?
    此外,就像我说的,一定要有执行UTL_FILE的权限
      

  8.   

    执行
    grant read, write on directory LEG to scott;
    grant read, write on directory ELE to scott;
    后select * from dba_directories;
    还是SYS的权限我用SYSDBA登录的,也报错错错555555555555555555555
      

  9.   

    验证数据库中是否存在 utl_file 包
    > select object_name from dba_procedures where object_name='UTL_FILE';如果不存在,执行 utlfile.sql 脚本
    > @ $ORACLE_HOME/rdbms/admin/utlfile.sql如果存在,检查是否存在指向其的共有同义词
    > select owner,synonym_name from dba_synonyms where table_name='UTL_FILE';如果没有共有同义词
    > CREATE OR REPLACE PUBLIC SYNONYM utl_file FOR sys.utl_file;为 public 授权
    > GRANT EXECUTE ON utl_file TO PUBLIC;