2014-10-01 41 views
1

在我的存儲過程中,我正在提取結果sys_refcursorRESULTSET。當我使用它RESULTSET_XML := XMLTYPE(RESULTSET);RESULTSET_XML is of SYS.XMLTYPE類型轉換爲XMLTYPE我得到它作爲如何重命名Oracle XMLTYPE生成的ROW和ROWSET節點並將其轉換爲varchar

<?xml version="1.0"?> 
    <ROWSET> 
    <ROW> 
     <DELIVERY_ORDER_ID>2</DELIVERY_ORDER_ID> 
     <COMPARTMENT_ID>162</COMPARTMENT_ID> 
    </ROW> 
    <ROW> 
     <DELIVERY_ORDER_ID>2</DELIVERY_ORDER_ID> 
     <COMPARTMENT_ID>163</COMPARTMENT_ID> 
    </ROW> 
    <ROW> 
     <DELIVERY_ORDER_ID>2</DELIVERY_ORDER_ID> 
    <COMPARTMENT_ID>164</COMPARTMENT_ID> 
</ROW> 
</ROWSET> 

這個結果我得到了通過轉換它使用RESULTSET_XML.getStringVal(); 現在我想這個數據發送到存儲過程作爲一個VARCHAR2燒焦。但是,存儲過程需要下面給出的VARCHAR2

<DocumentElement> 
     <Maingrid> 
      <DELIVERY_ORDER_ID>2</DELIVERY_ORDER_ID> 
      <COMPARTMENT_ID>162</COMPARTMENT_ID> 
     </Maingrid> 
     <Maingrid> 
      <DELIVERY_ORDER_ID>2</DELIVERY_ORDER_ID> 
      <COMPARTMENT_ID>163</COMPARTMENT_ID> 
     </Maingrid> 
     <Maingrid> 
      <DELIVERY_ORDER_ID>2</DELIVERY_ORDER_ID> 
      <COMPARTMENT_ID>164</COMPARTMENT_ID> 
     </Maingrid> 
     </DocumentElement> 

格式數據那麼,有沒有辦法重命名這些標籤並將其作爲varchar2。我試圖在鏈接 [[1]:How to rename an Oracle XMLTYPE node

給出的解決方案,但由於我有結果集,我無法使用此。

或者是否有一種方法在選擇語句本身我會得到上述格式的結果。我的oracle查詢是

SELECT 
    P_DO_ID AS DELIVERY_ORDER_ID, COMPARTMENT_ID 
FROM 
    T_M_COMPARTMENT 
WHERE 
    VEHICLE_ID = V_TRAILER; 

回答

1

您可以使用the DBMS_XMLGEN package來設置節點名稱並生成XML對象。作爲一個匿名塊一個簡單的例子:

set serveroutput on; 
declare 
    v_trailer number := 42; -- local for demo 
    ctx dbms_xmlgen.ctxhandle; 
    resultset sys_refcursor; 
    resultset_xml xmltype; 
begin 
    open resultset for 
    select p_do_id as delivery_order_id,compartment_id 
    from t_m_compartment 
    where vehicle_id = v_trailer; 
    ctx := dbms_xmlgen.newcontext(resultset); 
    dbms_xmlgen.setrowsettag(ctx, 'DocumentElement'); 
    dbms_xmlgen.setrowtag(ctx, 'Maingrid'); 

    resultset_xml := dbms_xmlgen.getxmltype(ctx); 
    dbms_xmlgen.closecontext(ctx); 
    close resultset; 

    dbms_output.put_line(resultset_xml.getStringVal()); 
end; 
/

我使用的查詢字符串創建的結果集,但如果你調用另一個函數來獲得剛剛替補任何機制/叫你正在使用現在而不是那個任務。如果您在過程中執行查詢以創建結果集(即,它不是來自另一個函數的調用),則只需將查詢文本傳遞給new_context而不是打開的引用遊標;儘管你不得不連接你的v_trailer值,所以引用光標總體上會更清晰。

我設置一個虛擬表達看起來像你的樣品,這得到輸出:

<DocumentElement> 
<Maingrid> 
    <DELIVERY_ORDER_ID>2</DELIVERY_ORDER_ID> 
    <COMPARTMENT_ID>162</COMPARTMENT_ID> 
</Maingrid> 
<Maingrid> 
    <DELIVERY_ORDER_ID>2</DELIVERY_ORDER_ID> 
    <COMPARTMENT_ID>163</COMPARTMENT_ID> 
</Maingrid> 
<Maingrid> 
    <DELIVERY_ORDER_ID>2</DELIVERY_ORDER_ID> 
    <COMPARTMENT_ID>164</COMPARTMENT_ID> 
</Maingrid> 
</DocumentElement> 

getStringVal()給你一個CLOB,但你可以插入到一個varchar2列,只要它總是小於4k(如果你在12c上,則爲32k),或者只要小於32k就傳給另一個程序。儘管將CLB或XMLType傳遞給CLOB或XMLType可能會更好,但要保持一致。

+0

這工作。我把這些東西放在一個函數中,我將它作爲'CLOB'返回,但是我的'CLOB'類型的'varible'沒有顯示任何輸出,即使它可用。我使用'DBMS_OUTPUT.PUT_LINE'看到輸出。 – 2014-10-01 11:31:00

+0

@GauravDhavale - 不太清楚你的意思;你怎麼調用這個函數?你的意思是一個SQL * Plus變量 - 如果是的話,你如何分配和顯示它;通話結束後你打印了嗎? – 2014-10-01 11:33:31

+0

使用以下查詢我得到所需的結構'SELECT XMLELEMENT( 「DocumentElement」,XMLAGG(XMLELEMENT( 「MainGrid」,XMLFOREST(COMPARTMENT_ID,DELIVERY_ORDER_ID))))ABC FROM T_M_COMPARTMENT,T_DE_DELIVERY_ORDER_DETAILS DO WHERE VEHICLE_ID =:V_TRAILER和DO。 DELIVERY_ORDER_ID = 2;' – 2014-10-01 11:33:32

0

另一種方法是定義一個對象類型,並從那裏創建XML:

CREATE OR REPLACE TYPE "Maingrid" AS OBJECT 
    ("DELIVERY_ORDER_ID" NUMBER, "COMPARTMENT_ID" NUMBER); 
/

SELECT XMLELEMENT("DocumentElement", 
    XMLAGG(XMLTYPE("Maingrid"(P_DO_ID, COMPARTMENT_ID)))).getClobVal() 
FROM T_M_COMPARTMENT 
WHERE VEHICLE_ID = V_TRAILER;