UTL_FILE 加载具有通配符扩展名的递归文件夹和文件

UTL_FILE to load recursive folders and files with wildcard extension

晚上好,

我要将本地路径中的 xls 文件加载到 oracle,但它们位于不同的文件夹中

在多年的文件夹中,在子文件夹中有几个文件。负载将是总的, 删除并重新加载。

但是我的文件夹结构有问题,我想知道 UTL_FILE 包是否可以完成我的工作。

文件夹的结构类似于:

人(目录)

-------->2020

-------->2021

------------>(文件)persona_0.xls

------------>(文件)persona_new.xls

我该怎么做:

1-遍历该文件夹结构的循环。

2-我如何使用通配符读取不同的文件 * person_ *

非常感谢,

感谢任何帮助或示例

你好。

UTL_FILE 仅适用于 DIRECTORY 对象,它们是指向数据库服务器上文件夹的预定义指针。您不能在文件名中使用通配符或遍历目录树。您不能使用 UTL_FILE 从客户端系统加载文件,除非(在某些情况下但不是全部)它们位于数据库可见的共享网络驱动器上。

来自文档:https://docs.oracle.com/database/121/ARPLS/u_file.htm#ARPLS069

Assuming the user has both READ and WRITE access to the directory object USER_DIR, the user can open a file located in the operating system directory described by USER_DIR, but not in subdirectories or parent directories of this directory.

我过去看到的唯一处理方式是

  1. 将所有文件放在数据库服务器上的同一目录中
  2. 在数据库服务器 运行 上有一个 shell 脚本 OS 列出并循环遍历目录中的文件,然后 运行 一个 SQL 脚本与 SQL*Plus 调用存储过程,每个文件名作为输入。然后,存储过程将打开目录中的文件并获取数据。当存储过程和 SQL 脚本完成时,控制将 return 到 shell 脚本,该脚本将循环到列表中的下一个文件并重复。

  1. 如果所有文件都为同一目标提供数据 table 并且具有相同的记录结构,请将它们全部放在同一目录中并创建指向所有文件的外部 table文件一次。您仍然必须在外部 table 定义中明确命名每个文件 - 没有通配符。然后 运行 一个存储过程,用于一次对整个数据集执行任何摄取操作。