存储过程解析xml文件并插入数据库
时间:2011-10-23
来源:互联网
create or replace procedure domsample as (d:\test varchar2(100),epg.xml varchar2(20000),err.log varchar2(20000))
-- 参数说明:-- 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 channel 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, false);
-- 是否使用文档指定的DTD验证文档合法性
xmlparser.setErrorLog(p, D:\test ||'/'|| err.log);
-- 设置错误日志文件
xmlparser.setBaseDir(p, D:\test);
-- 设置基本目录
-- 解析输入的xml文件
xmlparser.parse(p, D:\test ||'\'|| 雨花新闻频道.xml);
-- 获取解析后的文档对象
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;
总是提示我begin fusion package type use <an identifier> <a double-quoted delimited-identifier> from current cursor extenal language
项目急用 求高人指点
-- 参数说明:-- 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 channel 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, false);
-- 是否使用文档指定的DTD验证文档合法性
xmlparser.setErrorLog(p, D:\test ||'/'|| err.log);
-- 设置错误日志文件
xmlparser.setBaseDir(p, D:\test);
-- 设置基本目录
-- 解析输入的xml文件
xmlparser.parse(p, D:\test ||'\'|| 雨花新闻频道.xml);
-- 获取解析后的文档对象
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;
总是提示我begin fusion package type use <an identifier> <a double-quoted delimited-identifier> from current cursor extenal language
项目急用 求高人指点
作者: wspsky 发布时间: 2011-10-23
自己顶啊 在线等高人
作者: wspsky 发布时间: 2011-10-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28