+ -
当前位置:首页 → 问答吧 → 存储过程解析xml文件并插入数据库

存储过程解析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 
项目急用 求高人指点

作者: wspsky   发布时间: 2011-10-23

自己顶啊 在线等高人

作者: wspsky   发布时间: 2011-10-23

热门下载

更多