首页 文章

使用XMLType在oracle表中加载XML的过程

提问于
浏览
-1

我受到了一个xml类型过程的启发,用于解析和插入表中的数据 . 在我的情况下,表已经存在,一旦xml由外部应用程序生成,我需要在表中加载数据,所以我创建了我的程序,当我编译所有罚款但在执行时我有错误 . 所以这是我的xml内部程序 .

CREATE OR REPLACE PROCEDURE dta_proc AS 
l_xml xmltype;
l_val VARCHAR2(10000) := '<root>
  <record>
  <id_localisation>8PJ</id_localisation>
  <data>
   <id_client>50C</id_client>  
      <mail>1@mail.com</mail>
      <adress>10  </adress>
      <num_tel>001</num_tel>
      <key>C</key>
     <contact>
        <name>toto</name>
        <birth>01/30/009</birth>
        <city>London</city>
      </contact>
  </data> 
  <data>
  <id_client>25C</id_client> 
      <mail>2@gmaiil.com</mail>
      <adress>20</adress>
      <num_tel>02200</num_tel>
      <key>D1</key>
      <contact>
        <name>tata</name>
        <birth>02/08/2004</birth>
        <city>Spa</city>
      </contact>
  </data> 
</record>
  <record>
  <id_localisation>ESP31</id_localisation>
  <data>
   <id_client>70D</id_client>  
        <mail>3@gmail.com</mail>
        <adress>7Bcd</adress>
        <num_tel>5555</num_tel>
        <key>D2</key>
      <contact>
        <name>titi</name>
        <birth>05/07/2014</birth>
        <city>StMarine</city>
      </contact>
  </data>
  <data>
        <id_client>10D</id_client>
        <mail>4@gmail.com</mail>
        <adress>888</adress>
        <num_tel>881.0</num_tel>
        <key>D3</key>
      <contact>
        <name>awk</name>
        <birth>05/08/1999</birth>
        <city>Bahrein</city>
      </contact>
  </data>
 </record>
 </root>';
     statut number;
     id_client varchar2(13);
     date_ev date;
     id_diff  varchar2(13);
BEGIN
     l_xml        := xmltype(l_val);

     FOR x IN
     (SELECT VALUE(p) col_val
     FROM TABLE(XMLSEQUENCE(EXTRACT(l_xml, '/begin/entry'))) p
     )
     loop

IF x.col_val.existsnode('/root/record/id_localisation//text()') > 0 THEN
         localisation := x.col_val.extract('/root/record/id_localisation//text()').getstringval();
END IF;
if x.col_val.existsnode('/root/record/data/id_client/text()') > 0 then
     id_client := x.col_val.extract('/root/record/data/id_client/text()').getstringval();
end if;
if x.col_val.existsnode('/root/record/data/num_tel/text()') > 0 then
     num_tel := x.col_val.extract('/root/record/data/num_tel/text()').getstringval();
end if;
IF x.col_val.existsnode('/root/record/data/contact/city/text()') > 0 THEN
         city := x.col_val.extract('/root/record/data/contact/city/text()').getstringval();
end if;
INSERT INTO Customer
     (
          Loca,
          ID_CLT,
          TEL,
          Town
     )
     VALUES
     (
          localisation,
          id_client,
          num_tel,
          city
     );
     localisation := null;
     id_client := null;
     num_tel := null;
     city := null;
     end loop;
commit;
end  dta_proc;

执行时出错:

执行xml_procedure;

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00245: extra data after end of document
Error at line 26
ORA-06512: at "SYS.XMLTYPE", line 310
ORA-06512: at "xml_procedure", line 58
ORA-06512: at line 1
31011. 00000 -  "XML parsing failed"
*Cause:    XML parser returned an error while trying to parse the document.
*Action:   Check if the document to be parsed is valid.

还有一个问题 . 生成后,如何在我的程序中自动加载xml?

1 回答

  • 0

    而不是使用xmlsequence等来生成xmltype,我会做类似下面的事情(在11.2.0.3上适用于我):

    with sample_data as (select 
    '<root>
      <record>
        <id_localisation>8PJ</id_localisation>
        <data>
          <id_client>50C</id_client>  
          <mail>1@mail.com</mail>
          <adress>10  </adress>
          <num_tel>001</num_tel>
          <key>C</key>
          <contact>
            <name>toto</name>
            <birth>01/30/009</birth>
            <city>London</city>
          </contact>
        </data> 
        <data>
          <id_client>25C</id_client> 
          <mail>2@gmaiil.com</mail>
          <adress>20</adress>
          <num_tel>02200</num_tel>
          <key>D1</key>
          <contact>
            <name>tata</name>
            <birth>02/08/2004</birth>
            <city>Spa</city>
          </contact>
        </data> 
      </record>
      <record>
        <id_localisation>ESP31</id_localisation>
        <data>
          <id_client>70D</id_client>  
          <mail>3@gmail.com</mail>
          <adress>7Bcd</adress>
          <num_tel>5555</num_tel>
          <key>D2</key>
          <contact>
            <name>titi</name>
            <birth>05/07/2014</birth>
            <city>StMarine</city>
          </contact>
        </data>
        <data>
          <id_client>10D</id_client>
          <mail>4@gmail.com</mail>
          <adress>888</adress>
          <num_tel>881.0</num_tel>
          <key>D3</key>
          <contact>
            <name>awk</name>
            <birth>05/08/1999</birth>
            <city>Bahrein</city>
          </contact>
        </data>
      </record>
    </root>' str from dual)
    -- end of mimicking your sample xml
     select x.localisation,
            y.id_client,
            y.num_tel,
            y.city
     from   sample_data sd,
            xmltable('/root/record'
                     passing xmltype(sd.str)
                     columns localisation varchar2(20) path 'id_localisation',
                             subxml xmltype path '.') x,
            xmltable('/record/data'
                     passing x.subxml
                     columns id_client varchar2(13) path 'id_client',
                             num_tel varchar2(10) path 'num_tel',
                             city varchar2(20) path 'contact/city') y;
    
    LOCALISATION         ID_CLIENT     NUM_TEL    CITY                
    -------------------- ------------- ---------- --------------------
    8PJ                  50C           001        London              
    8PJ                  25C           02200      Spa                 
    ESP31                70D           5555       StMarine            
    ESP31                10D           881.0      Bahrein
    

    然后,您可以在插入中使用该select语句(显然,没有 WITH 子句,因为您已将xml数据存储在某处(例如,传入的表或参数) .

    关于你一旦生成的xml加载自动化的问题...你没有给我们任何足够的信息,以便能够回答这个问题 . 我假设生成xml的外部应用程序需要调用您的过程来存储它,并将xml作为参数传递 .

相关问题