【问题标题】:SQL Loader IssueSQL 加载程序问题
【发布时间】:2011-05-20 17:41:41
【问题描述】:

我试图通过 SQL 加载器从 XML 文件加载到 Oracle 的某些列是空的。例如,可能有几个填充但偶尔它有一些空值。

如何告诉 SQL*Loader 某些数据将为空,或者如何处理空值?

【问题讨论】:

    标签: sql xml oracle sql-loader


    【解决方案1】:

    您可能需要重新考虑加载和转换文件的方式。我假设这与your other question 有关,在这种情况下,您看起来像是在构建自己的 XML 解析器。 Oracle 提供了一些工具来帮助您做到这一点。

    首先,只是为了加载文件,您可以use SQL*Loader to load the data as an XMLType,也可以使用 DBMS_XSLPROCESSOR.READ2CLOB 之类的东西将文件作为 CLOB 读取,然后将其转换为 XMLType。

    在它作为XMLType 加载后,您可以使用一个PL/SQL 过程,该过程使用XPath 来遍历值并将它们插入到表中。

    而且可能还有其他一些方法可以做到这一点。

    我敢肯定,这些想法都不像您希望的那样简单。正确处理 XML 比 SQL*Loader 通常用于加载分隔文件要复杂得多。

    【讨论】:

      【解决方案2】:

      就像 jonarles 建议的那样。我使用 XMLTABLE 将 XML 数据插入到关系表中。首先将 XML 数据放入 Oracle 表的 XMLTYPE 列中:

      DROP TABLE XMLTEST;
      
      CREATE TABLE XMLTEST
      (   XML_COL XMLTYPE);
      
      DECLARE
        poXML CLOB; 
      BEGIN   
        -- Store the Purchase Order XML in the CLOB variable
        poXML := '<?xml version="1.0"?>
      <zalen>
          <zaal zaal_id="1">
              <alt_id>88</alt_id>
              <display_naam>01 West 430</display_naam>
              <alt_db>exp_BB</alt_db>
          </zaal>
          <zaal zaal_id="2">
              <alt_id>170</alt_id>
              <display_naam>02 Midden 010</display_naam>
              <alt_db>exp_BB</alt_db>
          </zaal>
          <zaal zaal_id="3">
              <alt_id>173</alt_id>
              <display_naam>02 Midden 110</display_naam>
              <alt_db>exp_BB</alt_db>
          </zaal>
          <zaal zaal_id="4">
              <syl_id>F491B0A119DABE76B2F6B2C0A3E902F6</syl_id>
              <alt_id>183</alt_id>
              <display_naam>02 Oost 010</display_naam>
              <alt_db>exp_BB</alt_db>
          </zaal>
          <zaal zaal_id="5">
              <alt_id>172</alt_id>
              <display_naam>02 Oost 300</display_naam>
              <alt_db>exp_BB</alt_db>
          </zaal>
        .
        .
        .
          <zaal zaal_id="126">
              <syl_id>F491B0A119DABE76B2F6B2C0A3E901E3</syl_id>
              <alt_id>129</alt_id>
              <display_naam>HB.02.140</display_naam>
              <alt_db>exp_EE</alt_db>
          </zaal>
      </zalen>';
      
        INSERT INTO xmltest (xml_col) VALUES (XMLTYPE(poXML));
      
      END;
      /
      

      使用 XMLTable 函数创建(或插入)表:

      drop table zalen;
      create table zalen as 
      select xt.zaal_id
      ,      xt.alt_id
      ,      xt.syl_id
      ,      xt.alt_db
      ,      xt.display_naam
      from xmltest xts
      ,    XMLTable('zalen/zaal' PASSING xts.xml_col 
                         columns zaal_id INTEGER PATH '@zaal_id'
                                   ,alt_id INTEGER PATH 'alt_id'
                                   ,syl_id VARCHAR2(100) PATH 'syl_id'
                                   ,display_naam VARCHAR2(100)PATH 'display_naam'
                                   ,alt_db VARCHAR2(100)PATH 'alt_db') xt;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2015-03-09
        • 2015-12-20
        • 2011-05-11
        相关资源
        最近更新 更多