关于XML文件内容插入Oracle数据库的应用

简介:

首先我们建立一个存储过程domsample,并且在oracle数据库中建立一个表people,另外新建一个people.xml文件及people.dtd文件,

新建表的SQL语句如下: 

CREATE TABLE PEOPLE
(
   ID VARCHAR2(10) PRIMARY KEY,
   NAME VARCHAR2(20),
   ADDRESS VARCHAR2(60),
   TEL VARCHAR2(20),
   FAX VARCHAR2(20),
   EMAIL VARCHAR2(40)
);

people.xml文件内容如下:

<?xml version="1.0"?>
<!DOCTYPE PEOPLE SYSTEM "people.dtd">
<PEOPLE>
 <PERSON ID="E01">
  <NAME>Tony Blair</NAME>
  <ADDRESS>10 Downing Street, London, UK</ADDRESS>
  <TEL>(061) 98765</TEL>
  <FAX>(061) 98768</FAX>
  <EMAIL>blair@everywhere.com</EMAIL>
 </PERSON>
 <PERSON ID="E02">
  <NAME>Bill Clinton</NAME>
  <ADDRESS>White House, USA</ADDRESS>
  <TEL>(001) 6400 98765</TEL>
  <FAX>(001) 6400 98769</FAX>
  <EMAIL>bill@everywhere.com</EMAIL>
 </PERSON>
 <PERSON ID="E03">
  <NAME>Tom Cruise</NAME>
  <ADDRESS>57 Jumbo Street, New York, USA</ADDRESS>
  <TEL>(001) 4500 67859</TEL>
  <FAX>(001) 4500 67895</FAX>
  <EMAIL>cruise@everywhere.com</EMAIL>
 </PERSON>
 <PERSON ID="E04">
  <NAME>Linda Goodman</NAME>
  <ADDRESS>78 Crax Lane, London, UK</ADDRESS>
  <TEL>(061) 54 56789</TEL>
  <FAX>(061) 54 56772</FAX>
  <EMAIL>linda@everywhere.com</EMAIL>
 </PERSON>
</PEOPLE>

people.dtd文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT ADDRESS (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT FAX (#PCDATA)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT PEOPLE (PERSON+)>
<!ELEMENT PERSON (NAME, ADDRESS, TEL, FAX, EMAIL)>
<!ATTLIST PERSON
 ID CDATA #REQUIRED
>
<!ELEMENT TEL (#PCDATA)>

存储过程语句如下:

create or replace procedure domsample(dir varchar2, inpfile varchar2,
                                      errfile varchar2) is
-- 参数说明:
-- dir      基本目录,如 'd:\xml\plsql'
-- inpfile  输入文件名,不含路径,如 'people.xml'
-- errfile  错误日志文件,保存解析错误信息, 如 'err.log'

p xmlparser.parser;
doc xmldom.DOMDocument;

procedure xmlinserttable(doc xmldom.DOMDocument) is
  nl xmldom.DOMNodeList;
  len number;
  len2 number;
  n xmldom.DOMNode;
  nnm xmldom.DOMNamedNodeMap;
  attrname varchar2(100);
  attrval varchar2(100);
  strSQL varchar2(20000);
  attn xmldom.DOMNode;
  nl2 xmldom.DOMNodeList;
begin
nl := xmldom.getElementsByTagName(doc, 'PERSON');  -- 读取 PERSON 元素
len := xmldom.getLength(nl);
-- 遍历元素
for i in 0..len-1 loop
   strSQL := 'INSERT INTO PEOPLE VALUES (';  -- 构造动态 SQL 语句
   n := xmldom.item(nl, i);
   if xmldom.getNodeName(n)='PERSON' then
      nnm := xmldom.getAttributes(n);  -- 读取 ID 属性
      attn := xmldom.item(nnm, 0);
      strSQL := strSQL || ''''  || xmldom.getNodeValue(attn) || '''';
   end if;
   -- 读取 PERSON 的子节点
   nl2 := xmldom.getChildNodes(n);
   len2 := xmldom.getLength(nl2);
   -- 处理 NAME, ADDRESS, ... 等节点
   for j in 0..len2-1 loop
      n := xmldom.item(nl2, j);
      strSQL := strSQL || ', '''  || xmldom.getNodeValue(xmldom.getFirstChild(n)) || '''';
   end loop;
   strSQL := strSQL || ')';   -- 完成 动态 SQL 语句的构造
   -- 执行插入记录的 SQL 语句
   execute immediate(strSQL);  -- 执行动态 SQL
end loop;
commit;  -- 提交插入
end xmlinserttable;

begin
-- 新建解析器实例
   p := xmlparser.newParser;

-- 设置解析器特性
   xmlparser.setValidationMode(p, TRUE); -- 是否使用文档指定的DTD验证文档合法性
   xmlparser.setErrorLog(p, dir || '\' || errfile); -- 设置错误日志文件
   xmlparser.setBaseDir(p, dir);   -- 设置基本目录

-- 解析输入的xml文件
   xmlparser.parse(p, dir || '\' || inpfile);

-- 获取解析后的文档对象
   doc := xmlparser.getDocument(p);

-- 释放解析器实例
   xmlparser.freeParser(p);
   
   dbms_output.put_line('插入数据中...');
   xmlinserttable(doc);

-- 释放文档对象
   xmldom.freeDocument(doc);

-- 处理异常
exception
  when xmldom.INDEX_SIZE_ERR then
     raise_application_error(-20120, 'Index Size error');
  when xmldom.DOMSTRING_SIZE_ERR then
     raise_application_error(-20120, 'String Size error');
  when xmldom.HIERARCHY_REQUEST_ERR then
     raise_application_error(-20120, 'Hierarchy request error');
  when xmldom.WRONG_DOCUMENT_ERR then
     raise_application_error(-20120, 'Wrong doc error');
  when xmldom.INVALID_CHARACTER_ERR then
     raise_application_error(-20120, 'Invalid Char error');
  when xmldom.NO_DATA_ALLOWED_ERR then
     raise_application_error(-20120, 'Nod data allowed error');
  when xmldom.NO_MODIFICATION_ALLOWED_ERR then
     raise_application_error(-20120, 'No mod allowed error');
  when xmldom.NOT_FOUND_ERR then
     raise_application_error(-20120, 'Not found error');
  when xmldom.NOT_SUPPORTED_ERR then
     raise_application_error(-20120, 'Not supported error');
  when xmldom.INUSE_ATTRIBUTE_ERR then
     raise_application_error(-20120, 'In use attr error');
end domsample; 

最后我们就可以调用存储过程了.可以在PLSQL Developer用以下方法调用:

exec domsample('d:\xml\plsql','people.xml','err.log');

必须注意的是:在d:\xml\plsql目录下必须有people.xml文件及people.dtd文件.

希望这篇文章能对初学者有所帮助!!!


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1639655

本文转自kenty博客园博客,原文链接http://www.cnblogs.com/kentyshang/archive/2007/07/17/820754.html如需转载请自行联系原作者


kenty

目录
打赏
0
0
0
0
23
分享
相关文章
崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB
文章是作者小草对崖山异构数据库迁移利器 YMP 的初体验分享,包括背景、YMP 简介、体验环境说明、YMP 部署(含安装前准备、安装、卸载、启动与停止)、数据迁移及遇到的问题与解决过程。重点介绍了 YMP 功能、部署的诸多细节和数据迁移流程,还提到了安装和迁移中遇到的问题及解决办法。
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
48 19
PolarDB开源数据库进阶课16 接入PostGIS全功能及应用举例
本文介绍了如何在PolarDB数据库中接入PostGIS插件全功能,实现地理空间数据处理。此外,文章还提供了使用PostGIS生成泰森多边形(Voronoi diagram)的具体示例,帮助用户理解其应用场景及操作方法。
39 0
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
66 11
【AI应用启航workshop】构建高可用数据库、拥抱AI智能问数
12月25日(周三)14:00-16:30参与线上闭门会,阿里云诚邀您一同开启AI应用实践之旅!
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
187 11
Oracle 从 DMP 文件中恢复指定表的步骤
Oracle 从 DMP 文件中恢复指定表的步骤
249 7
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
381 64

热门文章

最新文章

推荐镜像

更多