下面的代码用于接收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);
答案 0 :(得分: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#SQLRF06201和http://www.dba-oracle.com/t_appendchildxml.htm
的更多信息