2016-11-22 15 views
0

以下のコードは、xmlメッセージを取り込み、その中に含まれる(複数の)UUIDを識別し、テーブルを照会し、応答を含むxmlメッセージを作成するように設計されています。データベースクエリから完全なXMLメッセージを作成するにはどうすればよいですか?

PROCEDURE test_proc (p_xml_in IN  XMLTYPE, 
         p_xml_out OUT XMLTYPE) 
    IS 
    l_xml_section    XMLTYPE; 
    l_xml_body     CLOB; 
    l_xml_body_out    XMLTYPE; 
    l_start_root     VARCHAR2(20); 
    l_end_root     VARCHAR2(20); 
    v_uid_ck      VARCHAR2(50); 
    v_cd_uuid     VARCHAR2(50); 
    v_status      VARCHAR2(50); 


    BEGIN 
     FOR R IN (SELECT EXTRACTVALUE(VALUE(p), '//GUUID/text()') AS v_cd_uuid 

        FROM TABLE(XMLSEQUENCE(EXTRACT(p_xml_in, '//Check/GUUIDs/GUUID'))) p) 
     LOOP 
     v_uid_ck := r.v_cd_uuid; 

    SELECT XMLAGG(XMLELEMENT("GUUIDs", 
     XMLELEMENT("GUUID", v_uid_ck) 
     ,XMLELEMENT("test", t.test) 
     ,XMLELEMENT("test2", t.xml_out))).extract('/*') into l_xml_section   
     from table1 t 
     where v_uuid_ck = t.guuid; 

     dbms_output.put_line(l_xml_section.getclobval); 

     l_xml_body :='<TestResponse>' || l_xml_section || '</TestResponse>'; 

     l_xml_body_out := xmltype(l_xml_body); 

     END LOOP; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN NULL; 
    END; 
END test_proc; 
/

現時点ではUUIDあたりのメッセージの同等のものを出力しているが、しかし、私はすべてのUUIDのIEのための一つのメッセージたい:

<UUIDs> 
<UUID>123-123-1234</UUID> 
<Test>Y</Test> 
<Message> 
    <Msg>PASS</Msg> 
     <Msg_txt>more text here</Msg_txt> 
</Message> 
</UUIDs> 
<UUIDs> 
<UUID>123-123-1234</UUID> 
<Test>Y</Test> 
<Message> 
    <Msg>PASS</Msg> 
     <Msg_txt>more text here</Msg_txt> 
</Message> 
</UUIDs> 
<UUIDs> 
<UUID>123-123-1234</UUID> 
<Test>Y</Test> 
<Message> 
    <Msg>PASS</Msg> 
     <Msg_txt>more text here</Msg_txt> 
</Message> 
</UUIDs> 

を、私はそれがどのように見える必要があります。

</TestResponse> 
    <UUIDs> 
    <UUID>123-123-1234</UUID> 
     <Test>Y</Test> 
     <Message> 
     <Msg>PASS</Msg> 
     <Msg_txt>more text here</Msg_txt> 
     </Message> 
    <UUID>123-123-1234</UUID> 
     <Test>Y</Test> 
     <Message> 
     <Msg>PASS</Msg> 
     <Msg_txt>more text here</Msg_txt> 
     </Message> 
    <UUIDs> 
</TestResponse> 

ルートの開始ノードと終了ノードを追加しようとしましたが、||の引数のタイプまたは数が間違っています

l_xml_body := (l_start_root||l_xml_body||l_end_root); 

答えて

1

私はこのためにAPPENDCHILDXMLを使用できると思います。 https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions005.htm#SQLRF06201http://www.dba-oracle.com/t_appendchildxml.htm

set serveroutput on; 
DECLARE 
    x xmltype; 
    y xmltype; 
    z xmltype; 
BEGIN 
    x := xmltype('<UUIDs> 
       <UUID>123-123-1234</UUID> 
       <Test>Y</Test> 
       <Message>  
       <Msg>PASS</Msg>  
       <Msg_txt>more text here</Msg_txt> 
       </Message> 
       </UUIDs> 
       '); 

    y := xmltype('<TestResponse></TestResponse>'); 

    --append x as child of y, below /TestResponse 
    SELECT APPENDCHILDXML(y,'/TestResponse',x) INTO z FROM dual; 
    --print it to the screen 
    dbms_output.put_line(z.getClobVal); 

END; 

さらに詳しい情報:例えば、このような

関連する問題