关于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

相关文章
|
3月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
370 93
|
2月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】使用NetManager创建Oracle数据库的监听器
Oracle NetManager是数据库网络配置工具,用于创建监听器、配置服务命名与网络连接,支持多数据库共享监听,确保客户端与服务器通信顺畅。
206 0
|
5月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
3月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
313 8
|
5月前
|
SQL Oracle 关系型数据库
比较MySQL和Oracle数据库系统,特别是在进行分页查询的方法上的不同
两者的性能差异将取决于数据量大小、索引优化、查询设计以及具体版本的数据库服务器。考虑硬件资源、数据库设计和具体需求对于实现优化的分页查询至关重要。开发者和数据库管理员需要根据自身使用的具体数据库系统版本和环境,选择最合适的分页机制,并进行必要的性能调优来满足应用需求。
276 11
|
7月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
197 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
5月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—服务器异常断电导致Oracle数据库报错的数据恢复案例
Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库没有备份,仅有一些断断续续的归档日志。 Oracle数据库恢复流程: 1、检测数据库故障情况; 2、尝试挂起并修复数据库; 3、解析数据库文件; 4、导出并验证恢复的数据库文件。
|
5月前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle RMAN的目录数据库
Oracle RMAN默认将备份元信息存储在控制文件中,但控制文件损坏或丢失会导致恢复失败,且备份增多会使控制文件无限增长。为解决这些问题,Oracle引入了RMAN目录数据库(Catalog Database),专门用于存储RMAN备份的元信息。使用目录数据库可提升备份管理效率,支持多数据库共享、长期备份历史记录存储,并可保存RMAN脚本。本文详细介绍了如何创建目录数据库、注册目标数据库及其操作步骤。
147 0
|
6月前
|
存储 SQL Java
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。
|
8月前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
1603 28

热门文章

最新文章

推荐镜像

更多