我需要在 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;
对
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 的这段代码。我建议回到原始版本,这对我来说效果很好,不需要任何硬编码。