想在oracle中实现对文件的操作,将目录A下的文件复制到目录B下,而且每次目录A的名称是变动的。
create or replace procedure copyFile(fileUrl in varchar2, filePath in varchar2) is
  fileName varchar2(120):='555.txt';--文件的真实名称
  --fileUrl varchar2(120);--表中保存的文件路径
  --filePath varchar2(200):='D:work/zjgp_proj_temp/web-app/pub_res';--保存附件的根目录:此路径在不同的服务器可能设置不同,需要修改
  filePath2 varchar2(100);
  fileFullPath varchar2(250);--文件保存的全路径
  f1 utl_file.file_type;
begin
    --execute immediate 'connect sys/sys@system as sysdba';
    --execute immediate 'grant create any directory to zjgpv3';
    execute immediate 'create or replace directory ecjjattchdir as '||''''||'D:\tupian\'||'''';
    --execute immediate 'Grant read on directory ecjjattchdir to zjgpv3';这句执行会报错,不能给自己赋权限,我用zjgpv3,但我不可能用sysdba登陆再去赋权限,因为我这个存储过程是放到一个循环中执行的。本来“'D:\tupian\”是作为参数传近来的,每次都不一样的。
    execute immediate 'create or replace directory ecjjattchdir2 as '||''''||'D:\tupian\20090101\'||'''';
    --execute immediate 'Grant read write on directory ecjjattchdir2 to zjgpv3';
    f1 := utl_file.fopen('ECJJATTCHDIR','555.txt','r');--获取文件句柄    utl_file.fcopy('ECJJATTCHDIR',fileName,'ECJJATTCHDIR2',fileName);
    utl_file.fclose(f1);
    --end
end copyFile;
问题:f1 := utl_file.fopen('ECJJATTCHDIR','555.txt','r');--执行到这里就报错,文件操作失败,不知道为什么。
有谁知道不。网上没一个说的是有道理的。郁闷啊

解决方案 »

  1.   

    --是否与当前Oracle用户授权有关?--可以把读写权限授予特定用户,语法如下:
    GRANT READ[,WRITE] ON DIRECTORY directory TO username;--如:
    create or replace directory test_dir as '/ECJJATTCHDIR';
    grant read, write on directory test_dir to Your_user;
      

  2.   

    没有给读的权限阿,
    先创建好所有的文件夹,然后赋予权限给使用用户。
    grant read,write on directory xxx to u_user ;
    再执行打开文件的语句
      

  3.   

    如果oracle能够调用dos命令的话,直接调用dos命令对文件操作就好了
    在sql server里面我是会操作的,但在oracle里面还不会什么操作?
      

  4.   


    你的这个问题,我这里不存在。是不是目录下没有 555.txt 这个文件?
      

  5.   

    我在10g上测试的, scott具有dba权限scott@ORA1> create or replace directory test as '/test';目录已创建。scott@ORA1> declare
      2   f1 utl_file.file_type;
      3  begin
      4   f1 := utl_file.fopen('TEST','a.txt','r');
      5   utl_file.fclose(f1);
      6  end;
      7  /PL/SQL 过程已成功完成。scott@ORA1> declare
      2   f1 utl_file.file_type;
      3  begin
      4   f1 := utl_file.fopen('TEST','a_none_exists.txt','r');
      5   utl_file.fclose(f1);
      6  end;
      7  /
    declare
    *
    第 1 行出现错误:
    ORA-29283: invalid file operation
    ORA-06512: at "SYS.UTL_FILE", line 475
    ORA-29283: invalid file operation
    ORA-06512: at line 4