这两天有个小需要,摆弄一下oracle-XMLDOM,发现一个极其恶心的问题,就是CLOB varchar2能转XML,但是反过来不行,硬是在BAIDU里找,唯一有问的一贴好多年前的事了,没有回复,其余的全是垃圾,我找到用法了,给大家共享一下。
问题是这样的XML长度超过4000,假设源xml数据是分页的数据结果,想把长度超过4000的XMLDOM对象简单快捷的解析出来,就必须一行/一列分开解析,可是通过getelementsbyname获取到nodelist以后,每个node里面又有很多xml节点,如果一层一层扒洋葱一般的扒,程序写起来太累,而且很难DEBUG也无法支撑下次使用,分层扒开以后,domnode对象怎么再一次转成XML新生成一次XMLDOM再来getelementsbyname。。。
整个存过贴上来,注意其中WRITETOCLOB部分
CREATE OR REPLACE PROCEDURE p_xmlparse_split_data_line(p_xml IN clob,V_TNAME IN VARCHAR2)
AUTHID CURRENT_USER IS
/**
CREATED BY:LISW
CREATE DATE:20180409
DESCRIPTION:RESOLVE XML RESULT DATA INTO ORACLE DATA TABLE , AND INSERT INTO DATAS
**/
-- xml解析器
xmlpar xmlparser.parser := xmlparser.newparser;
-- dom文档对象
DOC XMLDOM.domdocument;
DOC_LINE XMLDOM.domdocument;
--根节点
ROOT_NODE XMLDOM.domnodelist;
--数据行
LIST_NODES XMLDOM.domnodelist;
--数据列
HASH_MAP_NODES XMLDOM.domnodelist;
--单元格
STRING_NODES XMLDOM.domnodelist;
--子节点
CHILD_NODES XMLDOM.domnodelist;
LIST_CHILD_NODES XMLDOM.domnodelist;
temp_node XMLDOM.domnode;
--分页大小
N_RP NUMBER :=10;
--CUR PAGE
N_PAGE NUMBER ;
--TOTAL DATAS
N_TOTAL NUMBER;
N_C NUMBER;
V_TEMP VARCHAR2(1200);
V_COMMENTS VARCHAR2(4000);
V_INSERT_SQL VARCHAR2(4000);
V_SQL VARCHAR2(4000);