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
项目急用 求高人指点
解决方案 »
- 求教关于sql时间问题
- Sequence重复问题如何解决
- 一个简单的sql查询,统计行数
- 如何使用SQL语句新建一个oracle数据库
- 请问个关于job生成角本,然后批处理的问题
- 请问ORACLE8.1.7在SOLARIS8下是否有图形界面
- 怎样显示某个触发器或database link的内容?比如我原来可以用的database link,由于密码改动,用不了了,在知道database link名字的情况下
- 急!nt上手工建立数据库后用enterprise management console不能连接到数据库?马上结帐
- 如何取统计后的前10条记录
- 怎么样才能取回internal的特权
- 哪位大神知道怎么用oracle实现负载均衡而不需要磁盘阵列
- ORACLE中同一张表有的字段中文乱码有的显示正常
1.第一行:create or replace procedure domsample as
这里已经定义了procedure,下面怎么又定义了一个procedure xmlinserttable(doc xmldom.DOMDocument) is呢?
而且,结尾那行,又是end domsample;
你在里面嵌套定义的,这样容易出问题,能不能分开两段定义呢?2.存储过程的参数,定义的时候,一般不用加长度的:
(d:\test varchar2(100),epg.xml varchar2(20000),err.log varchar2(20000))
一般都是dir in varchar2, infile in varchar2, errfile in varchar2..
CREATE OR REPLACE PROCEDURE njepg (dir VARCHAR2,dir1 VARCHAR2)
IS
--//XML解析器
xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;
--//DOM文档对象
doc xmldom.DOMDocument;
len integer;
personNodes xmldom.DOMNodeList;
chilNodes xmldom.DOMNodeList;
tempNode xmldom.DOMNode;
tempArrMap xmldom.DOMNamedNodeMap; --以下变量用于获取XML节点的值
evenid varchar2;
CHANNELNAME varchar2(20);
NAME varchar2(50);
BEGINTIME date;
DURATION NUMBER(7);
EVENTID VARCHAR2(3);
EVENTTYPE VARCHAR2(3);
ID VARCHAR2(10);
PROVIDERNAME VARCHAR2(10);
BROADCASTCODE VARCHAR2(12);
CREATIONTIME DATE;
language VARCHAR2(10);
BEGIN
dbms_output.put_line(dir||dir1);
xmlPar := xmlparser.newParser;
xmlparser.setErrorLog( xmlPar, dir1);
xmlparser.parse(xmlPar, dir);
doc := xmlparser.getDocument( xmlPar );
-- 释放解析器实例
xmlparser.freeParser(xmlPar);
-- 获取所有PERSON元素
personNodes := xmldom.getElementsByTagName( doc, 'PERSON' );
len := xmldom.getLength( personNodes );
--遍历所有PERSON元素
FOR i in 0..len-1
LOOP
--获取第i个PERSON
tempNode := xmldom.item( personNodes, i );
--所有属性
tempArrMap := xmldom.getAttributes(tempNode);
--获取PERSONID的值
evenid:= xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'evenid'));
--获取子元素的值
CHANNELNAME := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 )));
PROGRAMNAME := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 )));
BEGINTIME := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 2 )));
DURATION := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 3 )));
EVENTID := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 4 )));
EVENTTYPE := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 5 )));
PROVIDERID := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 6 )));
PROVIDERNAME := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 7 )));
BROADCASTCODE := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 8 )));
CREATIONTIME := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 9 )));
PROMLANGUAGE := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 10 )));
--插入数据
INSERT INTO channel VALUES (CHANNELNAME,PROGRAMNAME,BEGINTIME,DURATION,EVENTID,EVENTTYPE,PROVIDERID,PROVIDERNAME,BROADCASTCODE,CREATIONTIME,PROMLANGUAGE);
COMMIT;
END LOOP;
-- 释放文档对象
xmldom.freeDocument(doc);
EXCEPTION
WHEN OTHERS THEN
DBMS_output.PUT_LINE(SQLERRM);
END njepg;