【问题标题】:UTL_FILE to load recursive folders and files with wildcard extensionUTL_FILE 加载带有通配符扩展名的递归文件夹和文件
【发布时间】:2021-09-09 07:25:54
【问题描述】:

晚上好,

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

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

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

文件夹的结构类似于:

人(目录)

------->2020

------->2021

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

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

我该怎么办:

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

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

非常感谢,

感谢任何帮助或示例

您好。

【问题讨论】:

  • 除了@pmda 的声音回答之外,我想问一下......“加载”文件到底是什么意思?将整个完整文件插入 blob 列?还是您的意思是读取文件,将其解析出来,然后将解析后的数据作为不同的列插入到表中?如果这就是你的意思,你需要知道 xls 文件是专有的(微软)二进制格式,其他程序不容易读取。

标签: oracle oracle11g oracle10g oracle-sqldeveloper


【解决方案1】:

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

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

假设用户对目录具有 READ 和 WRITE 访问权限 object USER_DIR,用户可以打开位于操作中的文件 USER_DIR 描述的系统目录,但不在子目录中或 该目录的父目录。

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

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

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

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多