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 
项目急用 求高人指点

解决方案 »

  1.   

    楼主,没太看懂你代码的层次。
    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..
     
      

  2.   

    现在 已经更改过来了 但是我测试的时候发现 将地址传进去是 NOT SUPPORT 代码如下:
    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;