Oracle XML : Skip Not exist Node

后端 未结 2 2003
[愿得一人]
[愿得一人] 2021-01-17 03:40

I have a problem proceed xml data to insert in oracle table, here is my xml :


    
        gordon         


        
相关标签:
2条回答
  • 2021-01-17 03:59

    Here is the target table:

    CREATE TABLE my_test
         (
              LastName varchar2(20),
              phone   NUMBER,
              code    varchar2(20),
              address VARCHAR2(100)
         );
    

    The code to populate it:

    SET serveroutput ON
    DECLARE
    l_xml xmltype;
    l_val VARCHAR2(1000) := '<begin>
        <entry>
            <lastname>gordon</lastname>
            <numberlist>
                <number>100</number>
                <codelist>
                     <code>213</code>
                </codelist>
            </numberlist>
            <address>
                <addresslist>jl. jalan pelan-pelan ke bekasi, indonesia</addresslist>
            </address>
        </entry>
        <entry>
            <lastname>mark</lastname>
            <address>
                <addresslist>jl. jalan cepet-cepet ke jakarta, indonesia</addresslist>
            </address>
        </entry>
    </begin>';
         l_lastname varchar2(50);
         l_phone number;
         l_code number;
         l_address  varchar2(200);
    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('/entry/lastname/text()') > 0 THEN
             l_lastname := x.col_val.extract('/entry/lastname/text()').getstringval();
    END IF;
    if x.col_val.existsnode('/entry/numberlist/number/text()') > 0 then
         l_phone := x.col_val.extract('/entry/numberlist/number/text()').getstringval();
    end if;
    if x.col_val.existsnode('/entry/numberlist/codelist/code/text()') > 0 then
         l_code := x.col_val.extract('/entry/numberlist/codelist/code/text()').getstringval();
    end if;
    IF x.col_val.existsnode('/entry/address/addresslist/text()') > 0 THEN
             l_address := x.col_val.extract('/entry/address/addresslist/text()').getstringval();
    end if;
    INSERT INTO my_test
         (
              lastname,
              phone,
              code,
              address
         )
         VALUES
         (
              l_lastname,
              l_phone,
              l_code,
              l_address
         );
         l_lastname := null;
         l_phone := null;
         l_code := null;
         l_address := null;
         end loop;
    commit;
    end;
    
    0 讨论(0)
  • 2021-01-17 04:10

    You didn't say how you've tried to parsexml. Here is an example with XMLTABLE that gives you the excepted results:

    with xmldata(d) as (select xmltype('<begin>
        <entry>
            <lastname>gordon</lastname>
            <NumberList>
                <number>100</number>
                <codelist>
                     <code>213</code>
                </codelist>
            </NumberList>
            <address>
                <addresslist>Jl. jalan pelan-pelan ke Bekasi, Indonesia</addresslist>
            </address>
        </entry>
        <entry>
            <lastname>mark</lastname>
            <address>
                <addresslist>Jl. jalan cepet-cepet ke Jakarta, Indonesia</addresslist>
            </address>
        </entry>
    </begin>') from dual
    )
    select x.*
    from xmldata,
         xmltable('begin/entry' passing xmldata.d
                  columns
                  last_name varchar2(10) path 'lastname',
                  number_ number path 'NumberList/number',
                  code number path 'NumberList/codelist/code',
                  address varchar2(50) path 'address/addresslist'
         ) x
    ;
    

    Results:

    LAST_NAME  NUMBER_  CODE ADDRESS
    ---------- ------- ----- --------------------------------------------------
    gordon         100   213 Jl. jalan pelan-pelan ke Bekasi, Indonesia
    mark                     Jl. jalan cepet-cepet ke Jakarta, Indonesia
    

    Hope this helps !

    0 讨论(0)
提交回复
热议问题