Oracle xml 转换

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值