Oracle PL / SQL - 检查输入参数是否是目录

时间:2016-07-26 18:10:34

标签: oracle plsql

我正在开发一个从目录传递文件名作为in_file_name参数的包,但是调用程序也传递了子目录名,它不应该。现在,如果in_file_name是子目录,我通过执行以下操作来中止包:

    IF in_file_name IN ('sub_dir_1','sub_dir_2','sub_dir_3')
    THEN
        RETURN;
    END IF;

但是,如果创建了任何新目录,我可以预见将来的问题。有没有办法检查in_file_name是否是一个目录而不是硬编码名称?

我能想到的一种可能性是运行UTIL_OS.run_cmd('echo */')来获取目录列表。但是我不确定如何获得输出并在IF语句中使用它。

谢谢!

1 个答案:

答案 0 :(得分:2)

假设您正在使用目录对象,并且传递的文件名是其下的文件(或目录),您可以使用utl_file.fgetattr() procedure来测试它;如果传递的名称是文件,fexists标志将为true,如果它不存在或者是目录而不是普通文件,则它将为false。 (这似乎没有记录;但它至少在Linux上是如何工作的。)

所以你需要声明一些额外的变量,但是可以这样做:

utl_file.fgetattr(
  location => your_directory,
  filename => in_file_name,
  fexists => l_fexists,
  file_length => l_file_length,
  block_size => l_block_size);

if not l_fexists then
  -- handle file not existing OR being a directory
end if;