2010-12-06 2 views
1

Некоторые из столбцов, которые я пытаюсь загрузить в Oracle через SQL Loader из файла XML, являются нулевыми. Например, может быть несколько заполненных, но, возможно, нулевых значений.Ошибка SQL Loader

Как я могу сказать SQL * Loader, что некоторые данные будут пустыми или как я могу обращаться с нулями?

ответ

1

Как предложено jonearles. Я использую 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; 
0

Возможно, вы захотите переосмыслить способ загрузки и преобразования файлов. Я предполагаю, что это связано с 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 обычно используется для загрузки файлов с разделителями.

Смежные вопросы