动态填充外部表位置

Posted

技术标签:

【中文标题】动态填充外部表位置【英文标题】:Dynamically populate external tables location 【发布时间】:2015-03-16 15:05:30 【问题描述】:

我正在尝试使用 oracle 外部表将平面文件加载到数据库中,但我在 location 子句中遇到了一些问题。我们收到的文件附加了包括日期在内的几条信息,因此我希望在 location 子句中使用通配符,但看起来我做不到。

我认为我无法使用通配符是正确的,是否有人建议我如何在不为每个外部表编写大量代码的情况下完成此操作?

目前的想法:

目前我能想到的唯一方法是拥有一个 shell 观察程序脚本和参数表。用户可以指定:输入目录、文件掩码、外部表等。然后,当在目录中找到文件时,shell 脚本会生成带有文件掩码的文件列表。对于找到的每个文件,发出一个 alter table 命令,将给定外部表上的位置更改为该文件,并启动与该文件关联的其余 pl/sql。可以对使用文件掩码找到的每个文件重复此操作。我想这样做的好处是我还可以在每次运行后将日期添加到日志和错误文件的末尾。

【问题讨论】:

为什么要使用大量代码 - 这样您就可以识别特定的文件名(例如使用 utl_file),然后更改外部表的位置以指向该文件名?你也许可以用预处理器做一些事情;多个会话/进程会同时访问外部表吗? 我猜这是在 AskTom 中讨论过的 asktom.oracle.com/pls/apex/… 外部表是加载过程的第一部分,之后会启动一个pl/sql包来丰富/加载数据。我打算使用 oracle 作业来安排这些。因此,可以同时运行多个作业,但它们不应该访问同一个表。 【参考方案1】:

我将在最后发布我所采用的解决方案,这似乎是唯一的方法。

我有一个文件监视器,它在给定的输入目录中查找具有特定文件掩码的文件。查找表还包括外部表的名称。然后,我只需在外部表上发出一个带有新文件名列表的 alter table。

对我来说这不是什么大问题,因为我已经在使用 shell 进行大部分文件监视和文件操作。希望这可以节省寻找解决方案的人。

【讨论】:

以上是关于动态填充外部表位置的主要内容,如果未能解决你的问题,请参考以下文章

Azure Synapse 外部表位置参数化

Hive 外部表位置与加载路径

带有位置的 Hive 外部表

是否可以在 PLSQL/Oracle 中动态创建外部表

Oracle 11g - 使用序列中的常量值填充表行

Hive:修改外部表的位置需要太长时间