Oracle数据转换

     Oracle老师说这个数据转换程序在以后工作中要经常使用,所以叫我们写一个固定字段的数据转换.主要是了解内置包xmlParser和xmlDom的使用.程序一共分三步,
1,创建数据库表:

    create table People
(
    personid 
varchar2(10primary key,
    name 
varchar(20),
    address 
varchar(60),
    tel 
varchar(20),
    fax 
varchar(20),
    email 
varchar(40)    
);
    

2,xml转表:使用内置包xmlparser和xmldom解析xml文件和构造xmldom对象.将xml文件转换数据库表.
--编写存储过程解析xml文档,并将数据插入到表中,该存储过
--
程能接收输入文件参数,已知Oracle 9i的内置包
--
xmlParser和xmlDom可以用来解析和读写xmlDom对象.
create or replace procedure XML2Table(path varchar2)
    
is
    p xmlparser.parser; 
    doc xmldom.DOMDocument;
    nl xmldom.DOMNodeList;
    
len number;
    n xmldom.DOMNode;
    nnm xmldom.DOMNamedNodeMap;
    strSQL 
varchar2(1000);
    nl2 xmldom.DOMNodeList;
    len2 
number;
    n2 xmldom.DOMNode;    
begin
    p:
=xmlparser.newParser;                                           --新建解析器实例
    xmlparser.parse(p,path);                                           --解析输入的xml文件(path是xml文件地址)
    doc:=xmlparser.getDocument(p);                                --获取解析后的文档对象
    nl:=xmldom.getElementsByTagName(doc,'PERSON');        --获取Person的所有元素
    len:=xmldom.getLength(nl);                                        --获得长度
    dbms_output.put_line(len);
    
for i in 0..len-1                                                        --遍历所有元素
    loop
        strSQL:
='insert into people values(';
        n:
=xmldom.item(nl,i);
        
if xmldom.getNodeName(n)='PERSON' then
           nnm:
=xmldom.getAttributes(n);                           --获取所有元素的属性
           strSQL:=strSQL||''''||xmldom.getNodeValue(xmldom.item(nnm,0)) || '''';           --拼接SQL语句
        end if;
        nl2:
=xmldom.getChildNodes(n);
        len2:
=xmldom.getLength(nl2);
        
for j in 0..len2-1 loop
            n2:
=xmldom.item(nl2,j);
            strSQL:
=strSQL || ',''' || xmldom.getNodeValue(xmldom.getFirstChild(n2))||'''';
        
end loop;
        strSQL:
=strSQL||')';
        dbms_output.put_line(strSQL);
        
execute immediate(strSQL);  
    
end loop;
end XML2Table;
/
exec XML2Table('E:\people.xml');                               --执行存储过程,xml地址参数

3,表转xml:最后需要重新把表转换成xml
--编写存储过程把表中的记录转换成XML文档,该存储过程应---能接收输出文件参数,使用游标读取表中的记录,使用
--
XMLDOM包的方法构造XMLDOM对象,然后输出到文件.
create or replace procedure Table2Xml
    
is
    doc       xmldom.DOMDocument;
    docnode   xmldom.DOMNode;
    docelem   xmldom.DOMElement;
    rootnode  xmldom.DOMNode;
    childnode xmldom.DOMNode;
    childtext xmldom.DOMText;
    nodelist  xmldom.DOMNodelist;
    
cursor cur_t2x is select * from people;                              --定义游标
begin
    doc:
=xmldom.newDOMDocument();                                     --创建DOMDocument文档对应模型
    docnode:=xmldom.makeNode(doc);                                       --获得文档节点
    docelem:=xmldom.createElement(doc,'PEOPLE');                         --创建跟元素
        rootnode:=xmldom.appendChild(docnode,xmldom.makeNode(docelem));      --向文档节点加入跟节点
    for peo_cur in cur_t2x                                               --循环游标
    loop                                                              
           docelem:
=xmldom.createElement(doc,'PERSON');                      --创建Person节点
       xmldom.setAttribute(docelem,'PERSONID',peo_cur.PERSONID);         --获取Person节点属性
           docnode:=xmldom.appendChild(rootnode,xmldom.makeNode(docelem));   --加入跟节点
    
       docelem:
=xmldom.createElement(doc,'NAME');                           --创建Name节点
           childnode:=xmldom.appendChild(docnode,xmldom.makenode(docelem));     --加入子元素
       childtext:=xmldom.createTextNode(doc,peo_cur.NAME);                  --创建文本元素
       childnode:=xmldom.appendChild(childnode,xmldom.makeNode(childtext)); --向子节点加入文本元素

       docelem:
=xmldom.createElement(doc,'ADDRESS');
           childnode:
=xmldom.appendChild(docnode,xmldom.makenode(docelem));
       childtext:
=xmldom.createTextNode(doc,peo_cur.ADDRESS);
       childnode:
=xmldom.appendChild(childnode,xmldom.makeNode(childtext));

       docelem:
=xmldom.createElement(doc,'TEL');
           childnode:
=xmldom.appendChild(docnode,xmldom.makenode(docelem));
       childtext:
=xmldom.createTextNode(doc,peo_cur.TEL);
       childnode:
=xmldom.appendChild(childnode,xmldom.makeNode(childtext));

       docelem:
=xmldom.createElement(doc,'FAX');
           childnode:
=xmldom.appendChild(docnode,xmldom.makenode(docelem));
       childtext:
=xmldom.createTextNode(doc,peo_cur.FAX);
       childnode:
=xmldom.appendChild(childnode,xmldom.makeNode(childtext));

       docelem:
=xmldom.createElement(doc,'EMAIL');
           childnode:
=xmldom.appendChild(docnode,xmldom.makenode(docelem));
       childtext:
=xmldom.createTextNode(doc,peo_cur.EMAIL);
       childnode:
=xmldom.appendChild(childnode,xmldom.makeNode(childtext));

         
end loop;
    xmldom.writetoFile(doc,
'e:\pe.xml');                                 --保存的地址
    xmldom.freeDocument(doc);                                            
end;
/

posted @ 2008-05-23 23:23  Shinepolo  阅读(2225)  评论(0编辑  收藏  举报