2010-12-06 26 views
1

Certaines des colonnes que j'essaie de charger dans Oracle via SQL Loader à partir d'un fichier XML sont null. Par exemple, il peut y en avoir plusieurs remplis mais, occasionnellement, il y a des zéros.SQL Loader Problème

Comment puis-je dire à SQL * Loader que certaines données seront nulles, ou comment puis-je traiter les valeurs nulles?

Répondre

1

Comme jonearles suggéré. J'utilise XMLTABLE pour insérer des données XML dans des tables relationnelles. Mettez d'abord les données XML dans une colonne des tables 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; 
/

Utilisez la fonction XMLTable pour créer (ou insérer dans) la table:

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

Vous souhaiterez peut-être repenser la façon dont vous chargez et transformez les fichiers. Je suppose que cela est lié à your other question, dans ce cas, il semble que vous construisez votre propre analyseur XML. Oracle fournit quelques outils pour vous aider à le faire. Tout d'abord, juste pour charger le fichier, vous pouvez soit use SQL*Loader to load the data as an XMLType, ou vous pouvez utiliser quelque chose comme DBMS_XSLPROCESSOR.READ2CLOB pour lire le fichier en tant que CLOB, puis le convertir en XMLType.

Une fois chargé en tant que XMLType, vous pouvez utiliser une procédure PL/SQL qui utilise XPath pour parcourir les valeurs et les insérer dans la table.

Et il y a probablement d'autres façons de le faire. Je suis sûr qu'aucune de ces idées ne sont presque aussi faciles que ce que vous espériez. Le traitement XML correctement est beaucoup plus compliqué que ce que SQL * Loader est généralement utilisé pour le chargement de fichiers délimités.