簡體   English   中英

從XMLType Oracle檢索XML元素

[英]Retrieving XML elements from XMLType Oracle

有人可以幫我從Oracle的XMLType列中檢索數據嗎?

drop table xml_analysis;
create table xml_analysis(id number,soft_attributes XMLType);
create table xml_softattributes(id number,soft_attributes varchar2(200));
INSERT INTO xml_analysis VALUES 
   (       1, XMLType(
              '<softattributes> 
               <attr1>ABC</attr1>
               <attr2>XYZ</attr2> 
               <attr3>PQR</attr3> 
               </softattributes>
                '));
   insert into xml_softattributes values(1,'attr1');
   insert into xml_softattributes values(1,'attr2');
   insert into xml_softattributes values(1,'attr3');
  1. 表xml_analysis包含xmltype列,其屬性我不知道
  2. 表xml_softattributes包含軟件屬性(不是xpath)的列表,它們存在於xml_analysis表的xmltype列中
  3. 根據ID聯接表

現在我的問題是使用表xml_softattributes從xml_analysis表動態檢索數據,我該怎么做?

需要輸出

Softattribute Value 
=======================  
   attr1        ABC
   attr2        XYZ
   attr3        PQR

我能想到的可能解決方案是使用動態字符串並執行,但是我不希望使用動態字符串查詢來檢索數據。

您可以按以下方式結合使用existsNodeextract函數。

SELECT b.SOFT_ATTRIBUTES,
  CASE
    WHEN existsNode (a.soft_attributes ,'/*/'
      ||b.SOFT_ATTRIBUTES) = 1
    THEN a.soft_attributes.extract('/*/'
      ||b.SOFT_ATTRIBUTES
      ||'/text()').getStringVal()
  END value
FROM xml_analysis a,
  xml_softattributes b
WHERE a.id = b.id;

*用作通配符以匹配任何子節點。 例如,/ PO / * / STREET匹配作為PO元素的孫代的任何street元素。

輸出:

attr1   ABC
attr2   XYZ
attr3   PQR

如果屬性集是固定的( 'attr1', 'attr2', 'attr3' ),則可以從XML結構中提取數據,然后取消透視。 然后,您可以按常規方式連接到另一個表。

select id, softattribute, value
from (
       select x.id, xt.attr1, xt.attr2, xt.attr3
       from   xml_analysis x,
              xmltable('/softattributes'
                passing x.soft_attributes
                columns
                  attr1 varchar2(100) path 'attr1',
                  attr2 varchar2(100) path 'attr2',
                  attr3 varchar2(100) path 'attr3'
              ) xt
     )
unpivot ( value 
          for softattribute in (attr1 as 'attr1', attr2 as 'attr2', attr3 as 'attr3')
        )
;

ID  SOFTATTRIBUTE  VALUE
--  -------------  -----
 1  attr1          ABC
 1  attr2          XYZ
 1  attr3          PQR

如果只有通過檢查數據才能知道屬性集,那么UNPIVOT將不起作用XMLTABLE也將不起作用,因為PATH必須是字符串文字,在編寫代碼時就知道(或動態查詢編寫過程),則無法在運行時學習。

如果這是一個問題,您可能需要重新考慮XML結構; 'attr1'等應該是值,而不是標簽,就像值一樣。 (如果要在EAV模型中工作,請朝那個方向進行。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM