在 PLSQL 中的文件夹中查找文件

问题描述 投票:0回答:1

我需要在 PL/SQL 中创建一个函数,该函数将返回文件夹中的文件列表。 在名为“MY_SCRIPTS”的文件夹中有两个文件:file1.sql 和 file2.sql 最终,我想在此文件夹中搜索脚本列表并运行每个脚本。我不想通过使用 UTL_FILE 库中的函数并显式提供文件名来做到这一点。 这个想法是在只知道文件夹路径的情况下搜索它们。 这在 PL/SQL 中可能吗?

我一直在尝试像下面这样做,但程序返回零记录。

create type file_array as table of varchar2(100);
/
CREATE OR REPLACE FUNCTION LIST_FILES (lp_string IN VARCHAR2 default null)
RETURN file_array pipelined AS

lv_pattern VARCHAR2(1024);
lv_ns VARCHAR2(1024);

BEGIN
 
SELECT directory_path
INTO lv_pattern
FROM dba_directories
WHERE directory_name = '/home/oracle/Desktop/MY_SCRIPTS';

SYS.DBMS_BACKUP_RESTORE.SEARCHFILES(lv_pattern, lv_ns);

FOR file_list IN (SELECT FNAME_KRBMSFT AS file_name
FROM X$KRBMSFT
WHERE FNAME_KRBMSFT LIKE '%'|| NVL(lp_string, FNAME_KRBMSFT)||'%' ) LOOP
PIPE ROW(file_list.file_name);
END LOOP;

END;
/
grant execute on LIST_FILES to public;
create public synonym list_files for sys.LIST_FILES;
/
select * from table(list_files);

就像这样:

DECLARE

pattern VARCHAR2(1024) := '/home/oracle/Desktop/MY_SCRIPTS';
ns VARCHAR2(1024);

BEGIN
SYS.DBMS_BACKUP_RESTORE.searchFiles(pattern, ns);

FOR each_file IN (SELECT FNAME_KRBMSFT AS name FROM X$KRBMSFT WHERE FNAME_KRBMSFT LIKE '%.trc') LOOP
DBMS_OUTPUT.PUT_LINE(each_file.name);
END LOOP;
END;
file plsql directory plsqldeveloper
1个回答
0
投票

DBA_DIRECTORIES
的查询错误地查看了目录 name,这将是 Oracle 对象名称:

SELECT directory_path
INTO lv_pattern
FROM dba_directories
WHERE directory_name = '/home/oracle/Desktop/MY_SCRIPTS';

相反,它应该查看目录path

SELECT directory_path
INTO lv_pattern
FROM dba_directories
WHERE directory_path = '/home/oracle/Desktop/MY_SCRIPTS';

另一方面,代码甚至根本不需要访问

DBA_DIRECTORIES
。您的代码看起来松散地基于 来自 oracle-base.com 的 Tim Hall 的这段代码。我建议回到原始版本,这对我来说效果很好,不需要任何硬编码。

© www.soinside.com 2019 - 2024. All rights reserved.