【问题标题】:Downloading/unzipping/inserting with Oracle/PLSQL使用 Oracle/PLSQL 下载/解压缩/插入
【发布时间】:2020-12-08 16:38:42
【问题描述】:

我正在尝试将几个不同的 .csv 文件(压缩为 .gz)从 URL 插入到相应的表中。这些文件也会每天添加。我的想法是将它们全部下载到一个目录中(例如 oracle/stuff),解压缩它们,然后在 .csv 上进行插入(在特定时间自动)

例如

`somerandomsite\stuff\budget-071220.csv.gz  
somerandomsite\stuff\budget-081220.csv.gz        
somerandomsite\stuff\sold-071220.csv.gz         
somerandomsite\stuff\sold-081220.csv.gz        
somerandomsite\stuff\buy-071220.csv.gz  
somerandomsite\stuff\buy-081220.csv.gz`

我只使用 PL/SQL 不知道如何下载它们?在那之后,我最好的猜测是解压缩所述目录中的所有内容,但我也不确定将所有 .csv 放入相应表中的最简单方法是什么?在外部表中通过正则表达式加载它们 + 插入?

【问题讨论】:

  • 考虑使用 ETL 工具。

标签: sql oracle plsql


【解决方案1】:

如果您的数据库中安装了 APEX,并且文件可通过 REST API 获得,则可以调用 REST API 并使用类似于以下的单个插入语句将文件直接插入数据库。 apex_web_service.make_rest_request_b 对文件发出 REST 请求,UTL_COMPRESS.lz_uncompress 解压缩 gz 文件,最后 apex_data_parser.parse 可用于读取 CSV 文件,就好像它是一个可以选择插入到目标表中的表一样。

INSERT INTO your_table (column1, column2)
    SELECT col001, col002
      FROM TABLE (
               apex_data_parser.parse (
                   p_content     =>
                       UTL_COMPRESS.lz_uncompress (
                           apex_web_service.make_rest_request_b (
                               p_url           => 'http://yourserver.com/rest/api/budget-071220.csv.gz',
                               p_http_method   => 'GET')),
                   p_file_type   => 2, --2 is for CSV
                   p_skip_rows   => 0));

【讨论】:

  • 这似乎是一个很好的解决方案,谢谢。我会尽快尝试。如果没有可用的 REST,apex_web_service.make_request_b 也应该可以工作?
  • 如果 REST API 无法用于检索文件,我会将文件复制到 Oracle 可访问的文件夹中,然后使用 DBMS_LOB.loadblobfromfile 将文件加载到 BLOB 中。然后,您可以使用加载的 blob 代替 INSERT 语句中的 apex_web_service.make_rest_request_b 调用
【解决方案2】:

一种方法是结合shell脚本和pl/sql(块或存储过程)。如果文件相对较小,这种方法很好。

  1. Shell 脚本可以安排在可以读取文件夹并解压缩文件然后触发 pl/sql 过程的时间运行。
  2. pl/sql 过程使用 utl_file 读取文件并逐行处理记录。添加异常以使用 utl_file 将不良记录记录到单独的文件夹/文件中,以便在加载后进行调查。

如果文件在几个 Gig 中很大,SQL*LOADER 是一个选项,因为它比存储过程快得多。

【讨论】:

  • 我已经在按照阅读 OP 问题时的思路进行思考。一项调整-无论如何我都会使用 sqlldr (或外部表)。我不会通过尝试确定文件是否“足够大”以“证明”使用 sqlldr 来使问题复杂化。
  • 不幸的是,在我的情况下,Shell 脚本不是一个选项,但感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2011-05-28
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2012-10-10
相关资源
最近更新 更多