sql >> データベース >  >> RDS >> Oracle

Oracle XML:スキップが存在しないノード

    ターゲットテーブルは次のとおりです:

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

    入力するコード:

    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;
    


    1. GUIを使用してMySQLWorkbenchでサーバーステータスを確認する方法

    2. SQLServerの一時オブジェクトのキャッシュ

    3. MySQLの行を削除するにはクエリを削除します

    4. MariaDBのMAX()関数