【问题标题】:Bulk loading into Oracle with all tables in one data file使用一个数据文件中的所有表批量加载到 Oracle
【发布时间】:2015-05-12 23:43:09
【问题描述】:

我想将一堆数据批量加载到 Oracle 数据库中。我已经编写了一个程序来轻松格式化我想要的数据。我看到很多将 csv 文件加载到 Oracle 中的示例,但它们都需要为每个表创建一个控制文件,并将其链接到一个文件。

创建一个脚本来生成所有控制文件对我来说很简单,但是我首先想知道是否可能将所有数据放在一个文件中,并在数据文件中指定表名?

例如:

onefile.csv:
------------
details
1, John, john@gmail.com
2, Steve, steve@gmail.com
3, Sally, sally@gmail.com
account
1, John, johntheman, johnh43
2, Steve, password, steve.12
3, Sally, letmein, slllya2

免责声明:这是一个完全虚构的数据库设计,根本无法反映我在现实世界中如何存储用户数据。

【问题讨论】:

  • 我认为这不可能。
  • 我不相信将多个表的源数据放到一个文件中是可能的,但是作为旁注,关于从非 Oracle 数据库源加载数据,您也可以使用外部表而不是 sqlldr,这取决于您对可能有用的数据所做的操作(您可以在插入其他表、CTAS 查询等时使用它们,最大的优势之一是能够限制您加载的行) docs.oracle.com/cd/B19306_01/server.102/b14215/et_concepts.htm

标签: oracle


【解决方案1】:

您可以使用 UTL_FILE 读取 CSV。这将使您完全控制如何处理其内容。但这确实意味着您将浪费大量时间和精力来手动执行 SQL*Loader 的微薄而缓慢的实现。为什么要这样做?

每个数据源和/或目标一个文件是 CSV 生成的公认约定。这是合同的必要部分。如果我们想做其他事情,那么我们需要使用更合适的协议,例如 XML 或 JSON,可以支持程序化查询的东西。

【讨论】:

    【解决方案2】:

    为什么不使用 SQLLdr?请参阅 SQLdr docs。请参阅“区分不同的输入记录格式”。

    使用多个 INTO TABLE 子句的好处

    多个 INTO TABLE 子句使您能够:

    将数据加载到不同的表中

    从单个输入记录中提取多个逻辑记录

    区分不同的输入记录格式

    区分不同的输入行对象子类型

    但是您必须在每一行上指定表名(或它的 ID)。 SQLLrd 在行级别上工作,恐怕它不支持节。

    所以你可能需要把它改成:

    onefile.csv:
    ------------    
    details,1, John, john@gmail.com
    details,2, Steve, steve@gmail.com
    details,3, Sally, sally@gmail.com
    account,1, John, johntheman, johnh43
    account,2, Steve, password, steve.12
    account,3, Sally, letmein, slllya2
    

    这看起来像是对旧 COBOL 格式的回忆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多