2015-11-04 74 views
0

我有兩個表。我試圖加入他們,並通過在Oracle中使用SQL/XML(SQLX)來準備XML。這裏的問題是XMLELEMENT函數正在爲元素名稱使用硬編碼的值,但我希望將這些名稱作爲列數據。可能嗎?如何給列值作爲XML中的元素名稱

create table PRODUCTEDIT 
(
PRODUCTEDIT_NUM NUMBER(12) primary key, 
API_NAME  VARCHAR2(255) 
); 

create table PRODUCTEDITPARAMETER 
(
PRODUCTEDIT_NUM NUMBER(12) not null, 
PARAMETER_SEQ NUMBER(9) not null, 
PARAMETER_VALUE VARCHAR2(4000), 
CONSTRAINT fk_producteditparameter 
FOREIGN KEY (PRODUCTEDIT_NUM) 
REFERENCES PRODUCTEDIT(PRODUCTEDIT_NUM) 
); 

第一張表中有2條記錄。

PRODUCTEDIT_NUM   Api_Name 
1      ModifyProd 
2      CreateProd 

記錄第二個表:

PRODUCTEDIT_NUM  PARAMETER_SEQ  PARAMETER_VALUE 
1      1     10 
1      2     Data 
1      3     1 
1      4     Data1 
1      5     1 
2      1     11 
2      2     Voice 
2      3     1 

現在我想XMLOUTPUT象下面這樣:

<?xml version='1.0'?> 
<ModifyProd> 
    <1>10</1> 
    <2>Data</2> 
    <3>1</3> 
    <4>Data1</4> 
    <5>1</5> 
</ModifyProd> 
<CreateProd> 
    <1>11</1> 
    <2>Voice</2> 
    <3>1</3>  
</CreateProd> 

在上面的XML,我們有XMLELEMENT名稱(ModifyProd,CreateProd,1,2-等等)來自表數據。我無法通過在oracle中使用SQLXML來實現這一點。

我在下面試過,但似乎沒有工作。 XMLELEMENT沒有像我傳遞的那樣來看待價值。

SELECT XMLROOT(
     XMLELEMENT(d.api_name, 
      (SELECT XMLAGG(
         XMLELEMENT(e.parameter_seq,e.parameter_value        
         ) 
        ) 
       FROM producteditparameter e 
       WHERE e.productedit_num = d.productedit_num 
      ) 

     ),version '1.0', standalone yes 
     ) 

FROM productedit d 
+0

請編輯您的問題提供更多的信息 - 表結構,預期產出,你至今嘗試過,爲什麼它是不正確的...... –

+0

@AlexPoole是正確的......我們需要更多的細節想要你有什麼,你想要什麼.. – Cyryl1972

+1

你的XML有問題,請參閱[XML元素](http://www.w3schools.com/Xml/xml_elements.asp):* XML命名規則**元素名字必須以字母或下劃線***開頭。即像「」這樣的元素是不允許的! –

回答

2

我假定你正在尋找這樣的:

WITH t AS 
    (SELECT 'foo' AS ELEMENT_NAME, 'bar' AS ELEMENT_CONTENT FROM dual) 
SELECT XMLELEMENT(EVALNAME ELEMENT_NAME, ELEMENT_CONTENT) 
FROM t; 

<foo>bar</foo> 

更新基於額外的輸入

你的結果不是格式良好的XML。一個XML文檔必須只有一個根元素。所以,無論你問了幾個XML文檔,那麼你可以這樣做:

SELECT 
    XMLELEMENT(
     EVALNAME Api_Name, 
     XMLAGG(XMLELEMENT(EVALNAME parameter_seq, e.parameter_value) ORDER BY parameter_seq) 
    ) AS xml_result 
FROM PRODUCTEDITPARAMETER e 
    JOIN PRODUCTEDIT d USING (productedit_num) 
GROUP BY productedit_num, Api_Name; 

<ModifyProd><1>10</1><2>Data</2><3>1</3><4>Data1</4><5>1</5></ModifyProd> 
<CreateProd><1>11</1><2>Voice</2><3>1</3></CreateProd> 

,或者如果你需要一個XML你必須通過另一種元素,例如包圍它

SELECT 
    XMLELEMENT("Products", 
     XMLAGG(
      XMLELEMENT(
       EVALNAME Api_Name, 
       XMLAGG(XMLELEMENT(EVALNAME parameter_seq, e.parameter_value) ORDER BY parameter_seq) 
      ) 
     ) 
    ) AS xml_result 
FROM PRODUCTEDITPARAMETER e 
    JOIN PRODUCTEDIT d USING (productedit_num) 
GROUP BY productedit_num, Api_Name; 

<Products><ModifyProd><1>10</1><2>Data</2><3>1</3><4>Data1</4><5>1</5></ModifyProd><CreateProd><1>11</1><2>Voice</2><3>1</3></CreateProd></Products> 
0

另一種解決方案,如果我明白你想要什麼:

WITH t AS 
     ( SELECT LEVEL col1, 'test' || LEVEL col2 
       FROM DUAL 
     CONNECT BY LEVEL < 10) 
SELECT XMLSERIALIZE (DOCUMENT (xmltype (CURSOR (SELECT col1, col2 FROM t))) INDENT SIZE = 0) 
    FROM DUAL; 

然後,你可以使用XSD爲要變換輸出。

希望它可以幫助

相關問題