关于XML文件内容插入Oracle数据库的应用
2007-07-17 10:08
417 查看
首先我们建立一个存储过程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
新建表的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
相关文章推荐
- 关于XML文件内容插入Oracle数据库的应用
- 关于 jaxb解析xml 文件的内容
- Java生成和解析XML格式文件——重复生成多xml标记用于restful服务端插入Oracle数据库测试
- 关于如何使用vc6.0读取xml文件中的内容
- 关于如何使用vc6.0读取xml文件中的内容
- Android应用中res/drawable文件夹下定义的xml文件内容详解(一)
- Android应用中res/drawable文件夹下定义的xml文件内容(二)selector
- 关于XML 文件直接导入Mysql数据库内容笔记
- 关于用HTML显示XML文件内容的问题
- sed在匹配行之前插入文件内容
- 关于Oracle 12.1.0.2 的8个文件的文件内容
- 【慕课笔记】4-6 应用DOM4J及JDOM方式解析XML—关于JDOM使用过程中JAR包的引用
- c语言提取xml文件内容
- SSM(spring-springmvc-mybatis)整合开发xml配置文件内容springmvc-config.xml,application.xml,web.xml
- 关于cad生成dwf文件和插入dwf快
- ASP.NET通过http/https的POST方式,发送和接受XML文件内容
- 手写服务器httpserver_xml配置文件_sax解析基础应用JAVA205-206
- 关于 Eclipse 创建 Dynamic Web Project (动态的 WEB 项目) 为什么会出现没有web.xml配置文件的问题
- Java输入输出(7)---向指定文件,指定位置插入内容
- 用java语言从xml文件中按照编写的xpath提取相应的内容(详解)