【问题标题】:How to create a complete XML message from a database query?如何从数据库查询创建完整的 XML 消息?
【发布时间】:2016-11-22 23:54:56
【问题描述】:

我下面的代码旨在接收 xml 消息,遍历它以识别其中包含的(多个)UUID,然后查询表并创建带有响应的 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 的一条消息,即:

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

【问题讨论】:

    标签: xml plsql


    【解决方案1】:

    我认为您应该能够为此使用 APPENDCHILDXML。例如,像这样:

    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;
    

    更多关于https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions005.htm#SQLRF06201http://www.dba-oracle.com/t_appendchildxml.htm的信息

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 2011-10-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多