学校里要求做个题,题目要求是写出将已知格式xml文件中的数据导入Oracle数据库、把数据库中的数据导出成xml文件的过程。
已知格式xml文件如下:

在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程<?xml version="1.0"?>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
<PEOPLE>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
<PERSON PERSONID="E01">
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<NAME>Tony Blair</NAME>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<ADDRESS>10 Downing Street, London, UK</ADDRESS>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<TEL>(061) 98765</TEL><FAX>(061) 98768</FAX>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<EMAIL>blair@everywhere.com</EMAIL>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
</PERSON>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
<PERSON PERSONID="E02">
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<NAME>Bill Clinton</NAME>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<ADDRESS>White House, USA</ADDRESS>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<TEL>(001) 6400 98765</TEL><FAX>(001) 6400 98769</FAX>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<EMAIL>bill@everywhere.com</EMAIL>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
</PERSON>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
<PERSON PERSONID="E03">
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<NAME>Tom Cruise</NAME>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<ADDRESS>57 Jumbo Street, New York, USA</ADDRESS>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<TEL>(001) 4500 67859</TEL><FAX>(001) 4500 67895</FAX>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<EMAIL>cruise@everywhere.com</EMAIL>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
</PERSON>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
<PERSON PERSONID="E04">
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<NAME>Linda Goodman</NAME>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<ADDRESS>78 Crax Lane, London, UK</ADDRESS>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<TEL>(061) 54 56789</TEL><FAX>(061) 54 56772</FAX>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程        
<EMAIL>linda@everywhere.com</EMAIL>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
</PERSON>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
</PEOPLE>
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程

于是写出过程如下:
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程--建表
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
CREATE TABLE PEOPLE
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程(
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程   PERSONID 
VARCHAR2(10PRIMARY KEY,
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程   NAME 
VARCHAR2(20),
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程   ADDRESS 
VARCHAR2(60),
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程   TEL  
VARCHAR2(20),
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程   FAX  
VARCHAR2(20),
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程   EMAIL 
VARCHAR2(40)
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
--从xml文件载入数据保存到数据库的过程 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
create or replace procedure xml2db(xmlfile varchar2as
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  p xmlparser.Parser;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  doc xmldom.DOMDocument;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  n xmldom.DOMNode;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  nl xmldom.DOMNodeList;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
len number;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
--根据PERSON结点生成插入SQL语句的过程 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  function insertsql(node xmldom.DOMNode) return varchar2
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
is
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    n xmldom.DOMNode;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    nl xmldom.DOMNodeList;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
len number;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    nnm xmldom.DOMNamedNodeMap;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    isql 
varchar2(200);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
begin
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--取得PERSON结点所有属性 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    nnm := xmldom.getAttributes(node);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    isql :
= 'insert into people values(';
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    isql :
= isql || '''';
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--取得所有属性中的第一个属性,即"PERSONID",并拼接到SQL语句中 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    isql := isql || xmldom.getNodeValue(xmldom.item(nnm,0));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    isql :
= isql || '''';
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--取得PERSON结点下的所有结点,准备遍历 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    nl := xmldom.getChildNodes(node);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
len := xmldom.getLength(nl);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
for i in 0..len-1 loop
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程      
--取出第i个结点 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
      n := xmldom.item(nl,i);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程      isql :
= isql || ',';
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程      isql :
= isql || '''';
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程      
--将结点的文本值取出并拼接到SQL语句中
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
      isql := isql || xmldom.getNodeValue(xmldom.getFirstChild(n));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程      isql :
= isql || '''';
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
end loop;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    isql :
= isql || ')';
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
return isql;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
end insertsql;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
begin
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  p :
= xmlparser.newParser;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  xmlparser.parse(p,xmlfile);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
--转换xml文件成DOM对像 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  doc := xmlparser.getDocument(p);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  xmlparser.freeParser(p);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
--取出所有PERSON元素 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  nl := xmldom.getElementsByTagName(doc,'PERSON');
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
len := xmldom.getLength(nl);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
--清空people表的内容 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  delete from people;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
for i in 0..len-1 loop
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--取出第i个PERSON元素 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    n := xmldom.item(nl,i);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--执行插入该PERSON元素所用的SQL语句 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    execute immediate insertsql(n);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
end loop;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
commit;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  xmldom.freeDocument(doc);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
end xml2db;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
/
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
--将数据库中的数据导出成xml文件的过程 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
create or replace procedure db2xml(xmlfile varchar2as
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  doc xmldom.DOMDocument;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  ret xmldom.DOMNode;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  peoplenode xmldom.DOMNode;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
--遍历整个people表的游标 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  Cursor cur_people is select * from people;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
--将people表中一行记录转换为元素
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  --并插入到DOM文档对像根结点PEOPLE下的过程 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  procedure addperson(doc xmldom.DOMDocument,people xmldom.DOMNode,
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程                      v_pid 
varchar2,v_name varchar2,v_addr varchar2,
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程                      v_tel 
varchar2,v_fax varchar2,v_email varchar2)
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
is
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    personelem xmldom.DOMElement;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    personnode xmldom.DOMNode;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    itemelem xmldom.DOMElement;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    itemnode xmldom.DOMNode;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
text xmldom.DOMText;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
begin
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--创建PERSON结点 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    personelem := xmldom.createElement(doc,'PERSON');
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--设置PERSONID属性 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    xmldom.setAttribute(personelem,'PERSONID',v_pid);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    personnode :
= xmldom.appendChild(peoplenode,xmldom.makeNode(personelem));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--向PERSON结点中添加NAME元素
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    itemelem := xmldom.createElement(doc,'NAME');
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--  将NAME结点添加到PERSON结点中
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--  创建文本结点
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    text := xmldom.createTextNode(doc,v_name);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--  将文本结点添加到NAME结点下,以构成完整NAME元素
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--向PERSON结点中添加ADDRESS元素
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    itemelem := xmldom.createElement(doc,'ADDRESS');
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    itemnode :
= xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
text := xmldom.createTextNode(doc,v_addr);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    itemnode :
= xmldom.appendChild(itemnode,xmldom.makeNode(text));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--向PERSON结点中添加TEL元素
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    itemelem := xmldom.createElement(doc,'TEL');
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    itemnode :
= xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
text := xmldom.createTextNode(doc,v_tel);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    itemnode :
= xmldom.appendChild(itemnode,xmldom.makeNode(text));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--向PERSON结点中添加FAX元素
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    itemelem := xmldom.createElement(doc,'FAX');
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    itemnode :
= xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
text := xmldom.createTextNode(doc,v_fax);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    itemnode :
= xmldom.appendChild(itemnode,xmldom.makeNode(text));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
--向PERSON结点中添加EMAIL元素
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
    itemelem := xmldom.createElement(doc,'EMAIL');
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    itemnode :
= xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    
text := xmldom.createTextNode(doc,v_email);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    itemnode :
= xmldom.appendChild(itemnode,xmldom.makeNode(text));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
end addperson;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
begin
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
--创建一个新DOM文档对像 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  doc := xmldom.newDOMDocument;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
--为文档添加根结点PEOPLE
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  peoplenode := xmldom.makeNode(xmldom.createElement(doc,'PEOPLE'));
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  ret :
= xmldom.appendChild(xmldom.makeNode(doc),peoplenode);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
--使用游标遍历people中的每行,生成每一行对应的PERSON元素并添加到PEOPLE根结点中
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  for v_row in cur_people loop
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程    addperson(doc,peoplenode,v_row.personid,v_row.name,
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程              v_row.address,v_row.tel,v_row.fax,v_row.email);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
end loop;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  
--将结果写入指定文件 
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
  xmldom.writeToFile(doc,xmlfile);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程  xmldom.freeDocument(doc);
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
end db2xml;
在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
/

测试成功

相关文章: