现在要向Oracle中上传一个文件,代码如下:
create or replace function plan_fliles_load_file
      (filePath varchar2,fileName varchar2) return boolean
/* *******************************************************************************************
--功    能:向表中上传文件
--输入参数:
  fileName:要上传的文件名称, filePath:本文件全路径
--输出参数: 上传文件是否成功                   
--********************************************************************************************/
AS
    Result BOOLEAN;
    F_LOB BFILE;
    B_LOB BLOB;
    bfile_path varchar2;
   
begin
    INSERT INTO plan_files(filename,filecontent)
      valueS(fileName,EMPTY_BLOB())RETURN filecontent INTO B_LOB;
    create directory bfile_path as filePath;
   
    F_LOB:= BFILENAME (bfile_path, FILENAME);
         
  return(Result);
end plan_fliles_load_file;为什么create directory bfile_path as filePath;这句老出错,大家帮我修改修改,好长时间都解决不了,急急急。谢谢 

解决方案 »

  1.   

    你没有创建directory 的权限吧,先授权或者使用dba
      

  2.   

    用户已经有权限:Create any directory。但我的程序运行到:create directory bfile_path as filePath; 就是出错。我如何在我的函数内部修改呢?谢谢
      

  3.   

    命令行中创建directory也是成功的,大家帮忙修改一下
      

  4.   


    create directory bfile_path as filePath; 
    这属于DDL语句,在过程中是不能直接这样写的,不过可用动态的sql来实现,像这样:execute immediate 'create directory bfile_path as  '||filePath;
    整个存储过程可以这样来实现:
    create or replace function plan_fliles_load_file 
          (filePath varchar2,fileName varchar2) return boolean 
    /* ******************************************************************************************* 
    --功    能:向表中上传文件 
    --输入参数: 
      fileName:要上传的文件名称, filePath:本文件全路径 
    --输出参数: 上传文件是否成功                  
    --********************************************************************************************/ 
    AS 
        Result BOOLEAN; 
        F_LOB BFILE; 
        B_LOB BLOB; 
        bfile_path varchar2; 
        v_sql varchar2(2000);
      
    begin 
        INSERT INTO plan_files(filename,filecontent) 
          valueS(fileName,EMPTY_BLOB())RETURN filecontent INTO B_LOB; 
        v_sql:='create directory bfile_path as  '||filePath;
        execute immediate v_sql;  
        F_LOB:= BFILENAME (bfile_path, FILENAME); 
            
      return(Result); 
    end plan_fliles_load_file; 
      

  5.   

    *************对上面加一点修改*****************
    create directory bfile_path as filePath; 
    这属于DDL语句,在过程中是不能直接这样写的,不过可用动态的sql来实现,像这样: execute immediate 'create directory bfile_path as  '||filePath; 
    整个存储过程可以这样来实现: 
    create or replace function plan_fliles_load_file 
          (filePath varchar2,fileName varchar2) return boolean 
    /* ******************************************************************************************* 
    --功    能:向表中上传文件 
    --输入参数: 
      fileName:要上传的文件名称, filePath:本文件全路径 
    --输出参数: 上传文件是否成功                  
    --********************************************************************************************/ 
    AS 
        Result BOOLEAN; 
        F_LOB BFILE; 
        B_LOB BLOB; 
        bfile_path varchar2; 
        v_sql varchar2(2000); 
      
    begin 
        INSERT INTO plan_files(filename,filecontent) 
          valueS(fileName,EMPTY_BLOB())RETURN filecontent INTO B_LOB; 
        v_sql:='create directory bfile_path as  '||''''||filePath||''''; --用引号括起路径
        execute immediate v_sql;  
        F_LOB:= BFILENAME (bfile_path, FILENAME); 
            
      return(Result); 
    end plan_fliles_load_file; 
      

  6.   

    谢谢huangyunzeng2008的回答。当执行F_LOB:= BFILENAME (bfile_path, FILENAME); 语句时,程序出错了,提示bfile_path为null,为什么呢?v_sql:='create directory bfile_path as  '||''''||filePath||''''; --用引号括起路径
        execute immediate v_sql;  这两句执行是正常的
      

  7.   

    BFILENAME (bfile_path, FILENAME); 
    我建议你这样试试:
    BFILENAME (''''||bfile_path||'''', FILENAME); 
      

  8.   

    如果不行试试这个 :
    BFILENAME (''''||upper('bfile_path')||'''', FILENAME);