【发布时间】:2012-12-20 21:36:51
【问题描述】:
正在检查我要读取的文件是否存在。
【问题讨论】:
正在检查我要读取的文件是否存在。
【问题讨论】:
这里有另一种方法:
使用dbms_lob包的BFILE和fileexists函数:
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;
使用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;
【讨论】:
execute 包的UTL_FILE 权限授予将使用该包的用户或public。
创建一个检查文件是否存在的函数相当容易,只需尝试打开它并捕获任何异常(此示例函数取自 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' ) )
...
【讨论】:
使用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
【讨论】:
UTL_FILE.FGETATTR 的示例,以防万一您链接到的网站出现故障?另外,如果您还没有这样做,请take the tour 并阅读"How do I write a good answer?"