【问题标题】:Check if a file exists?检查文件是否存在?
【发布时间】:2012-12-20 21:36:51
【问题描述】:

正在检查我要读取的文件是否存在。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    这里有另一种方法:

    1. 使用dbms_lob包的BFILEfileexists函数:

      create or replace function FileExists(
         p_DirName in varchar2,     -- schema object name
         p_FileName in varchar2
       ) return number
      is
        l_file_loc bfile;
      begin
        l_file_loc := bfilename(upper(p_DirName), p_FileName);
        return dbms_lob.fileexists(l_file_loc);  -- 1 exists; 0 - not exists
      end;
      
    2. 使用utl_file包的fgetattr函数:

      create or replace function FileExists(
        p_DirName in varchar2,     -- schema object name
        p_FileName in varchar2
      ) return number
      is
        l_fexists boolean;
        l_flen   number;
        l_bsize  number;
        l_res    number(1);
      begin
        l_res := 0;
        utl_file.fgetattr(upper(p_DirName), p_FileName, l_fexists, l_flen, l_bsize);
        if l_fexists
        then
          l_res := 1;
        end if;  
        return l_res;
      end;
      

    【讨论】:

    • @ElShaikhaShaikha 尝试将execute 包的UTL_FILE 权限授予将使用该包的用户或public
    • 谢谢。我不必向公众授予对 UTL_FILE 的执行权限。第一个功能完美运行。我对其进行了编辑以适应我的数据库需求。再次感谢您的帮助。
    【解决方案2】:

    创建一个检查文件是否存在的函数相当容易,只需尝试打开它并捕获任何异常(此示例函数取自 AskTom

    CREATE OR REPLACE FUNCTION file_exists(p_fname IN VARCHAR2) RETURN BOOLEAN
    AS
      l_file UTL_FILE.FILE_TYPE;
    BEGIN
      l_file := UTL_FILE.FOPEN(SUBSTR( p_fname, 1, instr(p_fname,'/',-1) ),
                               SUBSTR( p_fname, instr( p_fname, '/', -1)+1 ), 'r' );   
      UTL_FILE.FCLOSE( l_file );
      RETURN TRUE;
    EXCEPTION
      WHEN UTL_FILE.INVALID_PATH      THEN RETURN FALSE;
      WHEN UTL_FILE.INVALID_OPERATION THEN RETURN FALSE;
    END;
    /
    

    那么你就可以使用了;

    IF ( file_exists( 'MED_LIST_19_OCT_12.csv' ) )
    ...
    

    【讨论】:

    • 我收到以下错误:错误(7,1):PL/SQL:语句被忽略错误(7,1):PLS-00201:必须声明标识符“UTL_FILE”
    • @ElShaikhaShaikha 为了保证安全(即您不希望任何具有 SQL 访问权限的人在您的文件系统中的任何地方读/写),您需要在 init.ora 中显式启用它您感兴趣的目录,请参阅例如 this link 如何执行此操作。
    【解决方案3】:

    使用UTL_FILE.FGETATTR 函数。 此功能是专门为此目的而设计的。

    语法:

    UTL_FILE.FGETATTR(
       location     IN VARCHAR2, 
       filename     IN VARCHAR2, 
       fexists      OUT BOOLEAN, 
       file_length  OUT NUMBER, 
       block_size   OUT BINARY_INTEGER);
    

    示例:

    DECLARE
      fexists      BOOLEAN;
      file_length  NUMBER;
      block_size   BINARY_INTEGER;
    BEGIN
    
        UTL_FILE.FGETATTR('MY_ORA_DIRECTORY', 'my_file_name.csv', fexists, file_length, block_size);
        IF fexists THEN
           -- Do something
           -- ...
        END IF;
    
    END IF;
    

    Oracle 文档: https://docs.oracle.com/database/121/ARPLS/u_file.htm#ARPLS70915
    另一个有用的链接: https://www.foxinfotech.in/2018/09/how-to-check-if-file-exists-in-pl-sql.html

    【讨论】:

    • 嗨,欢迎来到 Stack Overflow。您是否介意在答案本身中添加一个如何使用UTL_FILE.FGETATTR 的示例,以防万一您链接到的网站出现故障?另外,如果您还没有这样做,请take the tour 并阅读"How do I write a good answer?"
    • 谢谢各位。我已经更正了答案。希望,现在,它看起来更好)
    猜你喜欢
    • 2021-12-25
    • 2021-07-22
    • 2013-07-17
    • 2012-12-23
    • 2016-09-04
    相关资源
    最近更新 更多