2016-11-22 4 views
0

Mein Code unten ist entworfen, um eine XML-Nachricht aufzunehmen, iterieren, um die (mehrere) UUIDs darin zu identifizieren und dann eine Tabelle abzufragen und eine XML-Nachricht mit den Antworten zu erstellen.Wie erstellt man eine vollständige XML-Nachricht aus einer Datenbankabfrage?

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; 
/

Derzeit ist das Äquivalent einer Nachricht pro UUID ausgibt, jedoch möchte ich eine Botschaft für alle UUID dh:

<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> 

Und ich muss es wie folgt aussehen:

</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> 

Ich habe versucht, einen Stammanfangs- und Endknoten anzufügen, aber es sagt, dass ich den falschen Typ oder die falsche Anzahl der Argumente für || verwende wenn ich versuche, alles wie:

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

Antwort

1

Ich denke, Sie sollten APPENDCHILDXML dafür verwenden können. Zum Beispiel wie folgt aus:

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; 

Weitere Informationen über https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions005.htm#SQLRF06201 und http://www.dba-oracle.com/t_appendchildxml.htm

Verwandte Themen