CREATE OR REPLACE FUNCTION FUN_HT_GET_ISO_XML(IN_SQL VARCHAR2) RETURN CLOB IS
RESULT CLOB;
P_XMLCLOB CLOB;
D_XMLCLOB CLOB;
XMLPAR XMLPARSER.PARSER := XMLPARSER.NEWPARSER;
ROOT_ELMT XMLDOM.DOMELEMENT;
--//DOM文档对象
DOC_A XMLDOM.DOMDOCUMENT;
DOC_B XMLDOM.DOMDOCUMENT;
SOURCE_ELEM XMLDOM.DOMELEMENT;
V_NODE_PARENT XMLDOM.DOMNODE;
V_IMPORTED_NODE XMLDOM.DOMNODE;
BEGIN /*创建临时变量*/
DBMS_LOB.CREATETEMPORARY(D_XMLCLOB, TRUE);
DBMS_LOB.CREATETEMPORARY(P_XMLCLOB, TRUE); /*返回PARAM节点*/
P_XMLCLOB := '<PARAMS><X>1</X><D>2</D></PARAMS>';
/*ITEMLIST到CLOB变量*/
D_XMLCLOB := '<ITEMLIST><X>1</X><D>2</D></ITEMLIST>'; --->>>>解析PARAM节点
/*目标节点*/
XMLPARSER.PARSECLOB(XMLPAR, P_XMLCLOB);
DOC_A := XMLPARSER.GETDOCUMENT(XMLPAR);
/*源节点、被导入节点*/
XMLPARSER.PARSECLOB(XMLPAR, D_XMLCLOB);
DOC_B := XMLPARSER.GETDOCUMENT(XMLPAR);
SOURCE_ELEM := XMLDOM.GETDOCUMENTELEMENT(DOC_B); /*创建节点对象*/
/*合并两个XML到同一个节点*/
V_IMPORTED_NODE := XMLDOM.IMPORTNODE(DOC_A, XMLDOM.MAKENODE(SOURCE_ELEM), TRUE);
---IMPORTNODE方法用于将其它DOCUMENT中的节点导入当前的DOCUMENT
---第一个参数是要导入的节点,第二个参数表示是否克隆子节点,TRUE表示是
/* XMLDOM.SET("//NODE3")).APPENDCHILD(NEWNODE); */
V_NODE_PARENT := XMLDOM.MAKENODE(DOC_A);
V_NODE_PARENT := XMLDOM.GETFIRSTCHILD(V_NODE_PARENT); V_NODE_PARENT := XMLDOM.APPENDCHILD(V_NODE_PARENT,V_IMPORTED_NODE);
/*释放解析器实例*/
XMLPARSER.FREEPARSER(XMLPAR); /*创建临时变量*/
DBMS_LOB.CREATETEMPORARY(RESULT, TRUE);
/*写给返回值*/
XMLDOM.WRITETOCLOB(V_NODE_PARENT, RESULT);
/*释放资源*/
DBMS_LOB.FREETEMPORARY(P_XMLCLOB);
/*释放资源*/
DBMS_LOB.FREETEMPORARY(D_XMLCLOB);
XMLDOM.FREENODE(V_NODE_PARENT);
XMLDOM.FREENODE(V_IMPORTED_NODE);
XMLDOM.FREEDOCUMENT(DOC_A);
XMLDOM.FREEDOCUMENT(DOC_B);
RETURN(RESULT);END
FUN_HT_GET_ISO_XML;
这个函数测试无法从一个XML导入到另一个XML. V_NODE_PARENT出来是:<ITEMLIST>
<X>1</X>
<D>2</D>
</ITEMLIST>
我想实现最终拼成:
<PARAMS><X>1</X><D>2</D>
<ITEMLIST>
<X>1</X>
<D>2</D>
</ITEMLIST></PARAMS>
试了很久了,都不成功呀,求助!
RESULT CLOB;
P_XMLCLOB CLOB;
D_XMLCLOB CLOB;
XMLPAR XMLPARSER.PARSER := XMLPARSER.NEWPARSER;
ROOT_ELMT XMLDOM.DOMELEMENT;
--//DOM文档对象
DOC_A XMLDOM.DOMDOCUMENT;
DOC_B XMLDOM.DOMDOCUMENT;
SOURCE_ELEM XMLDOM.DOMELEMENT;
V_NODE_PARENT XMLDOM.DOMNODE;
V_IMPORTED_NODE XMLDOM.DOMNODE;
BEGIN /*创建临时变量*/
DBMS_LOB.CREATETEMPORARY(D_XMLCLOB, TRUE);
DBMS_LOB.CREATETEMPORARY(P_XMLCLOB, TRUE); /*返回PARAM节点*/
P_XMLCLOB := '<PARAMS><X>1</X><D>2</D></PARAMS>';
/*ITEMLIST到CLOB变量*/
D_XMLCLOB := '<ITEMLIST><X>1</X><D>2</D></ITEMLIST>'; --->>>>解析PARAM节点
/*目标节点*/
XMLPARSER.PARSECLOB(XMLPAR, P_XMLCLOB);
DOC_A := XMLPARSER.GETDOCUMENT(XMLPAR);
/*源节点、被导入节点*/
XMLPARSER.PARSECLOB(XMLPAR, D_XMLCLOB);
DOC_B := XMLPARSER.GETDOCUMENT(XMLPAR);
SOURCE_ELEM := XMLDOM.GETDOCUMENTELEMENT(DOC_B); /*创建节点对象*/
/*合并两个XML到同一个节点*/
V_IMPORTED_NODE := XMLDOM.IMPORTNODE(DOC_A, XMLDOM.MAKENODE(SOURCE_ELEM), TRUE);
---IMPORTNODE方法用于将其它DOCUMENT中的节点导入当前的DOCUMENT
---第一个参数是要导入的节点,第二个参数表示是否克隆子节点,TRUE表示是
/* XMLDOM.SET("//NODE3")).APPENDCHILD(NEWNODE); */
V_NODE_PARENT := XMLDOM.MAKENODE(DOC_A);
V_NODE_PARENT := XMLDOM.GETFIRSTCHILD(V_NODE_PARENT); V_NODE_PARENT := XMLDOM.APPENDCHILD(V_NODE_PARENT,V_IMPORTED_NODE);
/*释放解析器实例*/
XMLPARSER.FREEPARSER(XMLPAR); /*创建临时变量*/
DBMS_LOB.CREATETEMPORARY(RESULT, TRUE);
/*写给返回值*/
XMLDOM.WRITETOCLOB(V_NODE_PARENT, RESULT);
/*释放资源*/
DBMS_LOB.FREETEMPORARY(P_XMLCLOB);
/*释放资源*/
DBMS_LOB.FREETEMPORARY(D_XMLCLOB);
XMLDOM.FREENODE(V_NODE_PARENT);
XMLDOM.FREENODE(V_IMPORTED_NODE);
XMLDOM.FREEDOCUMENT(DOC_A);
XMLDOM.FREEDOCUMENT(DOC_B);
RETURN(RESULT);END
FUN_HT_GET_ISO_XML;
这个函数测试无法从一个XML导入到另一个XML. V_NODE_PARENT出来是:<ITEMLIST>
<X>1</X>
<D>2</D>
</ITEMLIST>
我想实现最终拼成:
<PARAMS><X>1</X><D>2</D>
<ITEMLIST>
<X>1</X>
<D>2</D>
</ITEMLIST></PARAMS>
试了很久了,都不成功呀,求助!
DECLARE
x xmltype:=XMLTYPE('<PARAMS><X>1</X><D>2</D></PARAMS>');
y XMLTYPE:=XMLTYPE('<ITEMLIST><X>1</X><D>2</D></ITEMLIST>');
BEGIN
x:=x.appendChildXML('/PARAMS',y);
dbms_output.put_line(x.getstringval);
END;
XMLDOM既繁琐又低效,如果不是涉及复杂的节点访问控制的话,最好用轻量级的xmltype的自带方法