select * from pdpla_approve_proj;
create or replace procedure proj_xml(st_id varchar2)
is
pro_rows pdpla_approve_proj%rowtype;--行游标
tempsql varchar2(100) :='select * from pdpla_approve_proj where st_id='''||st_id||'''';--
type cur is ref cursor;--自定义游标
proj_cur cur ;--自定义游标实例
doc xmldom.DOMDocument := xmldom.newDOMDocument;--文档对象
doc_node xmldom.DOMNode := xmldom.makeNode(doc);--文档节点
root_ele xmldom.DOMElement := xmldom.createElement(doc,'root');--文档根元素
st_pro_ele xmldom.DOMElement;
project_ele xmldom.DOMElement;
st_pro_node xmldom.DOMNode;
root_node xmldom.DOMNode;
project_node xmldom.DOMNode;
t_node xmldom.DOMNode;
cnt number :=1;
buf varchar2(1000);
begin
dbms_output.put_line('tempsql'||tempsql);
root_node := xmldom.appendChild(doc_node,xmldom.makeNode(root_ele));
xmldom.setAttribute(root_ele,'id',st_id);
open proj_cur for tempsql;--打开游标
loop
fetch proj_cur into pro_rows;
exit when proj_cur%notfound;
project_ele := xmldom.createElement(doc,'project');
project_node := xmldom.appendChild(root_node,xmldom.makeNode(project_ele));
st_pro_ele := xmldom.createElement(doc,'st_pro_id');
st_pro_node := xmldom.appendChild(project_node,xmldom.makeNode(st_pro_ele));
t_node := xmldom.appendChild(st_pro_node,xmldom.makeNode(xmldom.createTextNode(doc,pro_rows.st_project_id)));
st_pro_ele := xmldom.createElement(doc,'st_info_type');
st_pro_node := xmldom.appendChild(project_node,xmldom.makeNode(st_pro_ele));
t_node := xmldom.appendChild(st_pro_node,xmldom.makeNode(xmldom.createTextNode(doc,pro_rows.st_info_type)));
cnt :=cnt+1;
end loop;
close proj_cur;
xmldom.writeToBuffer(doc,buf);
xmldom.freeDocument(doc);
dbms_output.put_line('cnt'||cnt);
dbms_output.put_line('doc'||buf);
exception
when others then
dbms_output.put_line('sqlerrm'||sqlerrm);
end;
create or replace procedure p_parse (ID in varchar2) is
--创建xml解析器实例xmlparser.Parser
xmlPar xmlparser.Parser :=xmlparser.newParser;
--定义DOM文档
xDoc xmldom.DOMDocument;
--定义DATA子节点数目变量
lenItme integer;
--定义节点列表,存放DATA节点们
itemNodes xmldom.DOMNodeList;
--定义节点列表,存放DATA子节点们
childNodes xmldom.DOMNodeList;
--定义节点,存放单个DATA节点
itemNode xmldom.DOMNode;
--定义属性变量,存放节点属性
itemArrMap xmldom.DOMNamedNodeMap;
--定义其他变量,存放子节点的值
name varchar(100);
value varchar(100);
newid NUMBER(10);
--定义clob变量,存放xml字符串para_name
xmlStr clob;
begin
for cur in (select t.xml_data para_name ,t.id from xmldata t where t.id=ID )
--从xmldata表中查询数据,id不是唯一标识,一个id可查出多条数据(XML中多条数据),故用loop循环
loop
--获取para_name中的xml字符串
xmlStr:=cur.para_name;
xmlPar :=xmlparser.newParser;
--解析xmlStr中xml字符串,并存放到xmlPar中
xmlparser.parseClob(xmlPar, xmlStr);
--将xmlPar中的数据转存到dom文档中
xDoc:=xmlparser.getDocument(xmlPar);
xmlparser.freeParser(xmlPar); --释放解析器实例
--获取所有DATA节点
itemNodes:=xmldom.getElementsByTagName(xDoc,'DATA');
--获取DATA节点的个数
lenItme :=xmldom.getLength(itemNodes);
--遍历所有的DATA节点
for i in 0..lenItme-1
loop
begin
--获取节点列表中的第i个DATA节点
itemNode:=xmldom.item(itemNodes,i);
--获取第i个DATA节点的所有子节点
childNodes:=xmldom.getChildNodes(itemNode);
--获取所有子节点的值
newid:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(childNodes,0)));
name:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(childNodes,1)));
value:=xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(childNodes,2)));
--将子节点的值newid,name,value存放到xmltest
insert into xmltest values(newid,name,value);
commit;
end;
end loop;
end loop;
--是否dom文档
xmldom.freeDocument(xDoc);
--异常和错误处理
EXCEPTION
WHEN OTHERS THEN
DBMS_output.PUT_LINE(SQLERRM);
end p_parse;