当前位置: 首页 > 面试题库 >

XML Oracle:多个子节点摘录

农英杰
2023-03-14
问题内容

我有一个xml代码:

<begin>
    <entry>
        <lastname>gordon</lastname>
        <NumberList>
            <number>100</number>
            <codelist>
                 <code>213</code>
                 <code>214</code>
            <codelist>
            <login>
                 <user>user1</user>
                 <user>user2</user>
            </login>
        <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>

我的代码

FOR r IN (SELECT VALUE(p) col_val,
                 EXTRACT(VALUE(P), '/entry/codelist') AS code,
                 EXTRACT(VALUE(P), '/entry/login') AS login
           FROM TABLE(XMLSequence(Extract(x,'/begin/entry'))) p)
LOOP
   IF r.col_val.existsnode('/entry/lastname/text()') > 0 
   THEN
      vc_lastname := r.col_val.extract('/sdnEntry/lastname/text()').getstringval();
   END IF;

   IF r.col_val.existsnode('/entry/address/addresslist/text()') > 0 
   THEN
    vc_address := r.col_val.extract('/sdnEntry/address/addresslist/text()').getstringval();
   END IF;

   IF r.col_val.existsnode('/entry/codelist/id/code/text()') > 0 AND r.col_val.existsnode('/entry/login/user/text()') > 0 
   THEN
      FOR R1 IN (SELECT EXTRACTVALUE(VALUE(T1), '/codelist/code/text()') AS code
                   FROM TABLE(XMLSEQUENCE(EXTRACT(R.code, '/codelist'))) T1)
      LOOP
         DBMS_OUTPUT.PUT_LINE(vc_uid||' - '||vc_firstName||' - '||R1.code||' - '||R2.address);
      END LOOP;

      FOR R2 IN (SELECT
                        EXTRACTVALUE(VALUE(T1), '/login/user/text()') AS user
                   FROM TABLE(XMLSEQUENCE(EXTRACT(R.address, 'login/'))) T1)
      LOOP
         DBMS_OUTPUT.PUT_LINE(vc_uid||' - '||vc_firstName||' - '||R2.user||' - '||R2.address);
      END LOOP;
  ELSE
        DBMS_OUTPUT.PUT_LINE(vc_uid||' - '||vc_firstName);
  END IF;

我的问题:如何循环子节点,以便数据将变成这样:

LastName | Number | code    | user  |   address
gordon   | 100    | 213     | user1 |Jl. jalan pelan-pelan ke Bekasi, Indonesia
gordon   | 100    | 213     | user2 |Jl. jalan pelan-pelan ke Bekasi, Indonesia
gordon   | 100    | 214     | user1 |Jl. jalan pelan-pelan ke Bekasi, Indonesia
gordon   | 100    | 214     | user2 |Jl. jalan pelan-pelan ke Bekasi, Indonesia
mark     | Null   | null    | null  |Jl. jalan cepet-cepet ke Jakarta, Indonesia

任何帮助将不胜感激。


问题答案:

您可以使用以下XMLTable()功能获得所需的结果:

select q.Lastname
     , q.Numberid
     , s.codeid
     , w.LoginId
     , q.address
  from t1 t
  left join xmltable('/begin/entry'
                      passing t.xml_col 
                      columns LastName   varchar2(21)  path 'lastname',
                              NumberId   number        path 'NumberList/number',
                              Address    varchar2(201) path 'address/addresslist',
                              CodeList   XmlType       Path 'NumberList/codelist/code',
                              Logins     XmlType       Path 'NumberList/login/user'
                      ) q
    on (1=1) 
  left join xmltable('/code'
                      passing q.CodeList
                      columns CodeId number path '.') s
    on (1=1)
  left join   xmltable('/user'
                        passing q.Logins
                        columns LoginId varchar2(11) path '.') w
    on (1=1)

结果: SQLFiddle演示

Lastname Numberid Codeid Loginid Address 
---------------------------------------------------------------------------
gordon   100      213    user1   Jl. jalan pelan-pelan ke Bekasi, Indonesia 
gordon   100      213    user2   Jl. jalan pelan-pelan ke Bekasi, Indonesia 
gordon   100      214    user1   Jl. jalan pelan-pelan ke Bekasi, Indonesia 
gordon   100      214    user2   Jl. jalan pelan-pelan ke Bekasi, Indonesia 
mark     null     null   null    Jl. jalan cepet-cepet ke Jakarta, Indonesia

了解有关XMLTable()功能的更多信息。

注意 :使用11.2.0.2之前的Oracle版本ORA-1780 error时,当cursor_sharing参数设置为FORCESIMILAR(从11.2开始不推荐使用)时,您会遇到某些类型的XML查询的(错误8545377
)。将cursor_sharing参数设置为EXACT(默认值)将解决此问题。



 类似资料:
  • 预期结果: 如有任何帮助,我们将不胜感激!

  • 我当前的firebase结构如下所示 本来我的保安看起来 这一切都很好,因为我可以通过 然而,我想给这个分支增加更多的安全性,这样用户就不能通过写操作(读取是可以的)更新前端的代码来修改其中的一些条目。我希望用户能够根据isAdmin标志修改这些条目,例如, companyId(读:auth!=null,写:isAdmin==true) 因为所有读取=auth!=无效的起初,我认为因为我能够读取所

  • 我不太确定它是如何工作的,任何建议或帮助将非常感谢!

  • 我正在做一个项目,以创建一个超过2个子节点的树。我明白在创建二叉树时,我们可以只创建一个左节点和一个右节点来充当子节点,但当我在网上寻找创建树的帮助时,我找到的每一个解决方案都谈到了创建二叉树。我明白创建树的部分意味着您需要创建子节点数组或arraylist,但我不明白如何将数据放入数组,或者如何将子节点数组“连接”到父节点? 这是我目前掌握的代码。我知道这不是很多,但我正在努力刚刚开始这个项目。

  • 我在库伯内特斯集群中运行3个节点。每个节点都有相同的Pod myApp。我使用NodePort类型创建一个服务,以便所有3个节点都可以从外部访问。服务yaml如下所示 假设3个节点的节点IP端口为: 1.192.168.18.1:30010 2.192.68.18.2:30010 3.192.18.18.3:30010 我的问题是:<br>1.如果所有请求都来自IP为(192.168.18.1:3

  • 假设我们有一个具有10个GPU和40个CPU核的单个节点。这是否可以用来将节点拆分成10个节点,每个节点有4个核心,每个GPU,并带有显式的CPU/GPU绑定?如果是,配置需要是什么样子的?