xml文件:
<?xml version="1.0" encoding="gbk"?>
<TRS>
<REC>
<INFO_ID>1</INFO_ID><br/><br/>
<作者>未知</作者><br/><br/>
<修改日期>未知</修改日期><br/><br/>
<分类>杂志</分类><br/><br/>
<发表日期>2009</发表日期><br/><br/>
<字数>100</字数><br/><br/>
<录入员>王艳娜</录入员><br/><br/>
<录入日期>2010.10.19</录入日期><br/><br/>
<日期>2009</日期><br/><br/>
<来源>炎黄春秋杂志</来源><br/><br/>
<标题>新年致读者</标题><br/><br/>
<正文>在新年将至的时候,许多作者和读者来电来信,询问杂志社的情况和今年的编辑方针,借此机会,我们向大家汇报一下我们的情况和法.</正文><br/><br/>
<正文字数>88</正文字数><br/><br/>
<状态>优良</状态><br/><br/>
</REC></TRS>---从网上找到的存储过程
CREATE OR REPLACE PROCEDURE addPerson(file_path VARCHAR2,log_path VARCHAR2)    
 AS    
 --//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节点的值    
"日期" char(20);
"分类" char(150);
"标题" char(2000);
"正文" varchar2(4000);
"字数" char(20);
"正文字数" char(20);
"录入日期" char(20);
"录入员" char(20);
"修改日期" char(20);
"INFO_ID" char(10);
"状态" char(50);
"发表日期" char(50);
"来源" char(50);
"作者" char(50)   
 --================================    
 BEGIN    
   xmlPar := xmlparser.newParser;    
   xmlparser.setErrorLog( xmlPar, log_path);    
   xmlparser.parse(xmlPar, file_path);    
   doc := xmlparser.getDocument( xmlPar );     
   -- 释放解析器实例    
   xmlparser.freeParser(xmlPar);    
   -- 获取所有PERSON元素    
   personNodes := xmldom.getElementsByTagName( doc,'REC');    
   len := xmldom.getLength( personNodes );    
   --遍历所有PERSON元素    
   FOR i in 0..len-1    
   LOOP    
     --获取第i个PERSON    
     tempNode := xmldom.item( personNodes, i );    
     --所有属性    
     tempArrMap := xmldom.getAttributes(tempNode);    
     --获取PERSONID的值    
     pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'INFO_ID'));    
     --获取所有子节点   
     chilNodes := xmldom.getChildNodes(tempNode);   
     --获取子节点的个数    
     tmp := xmldom.GETLENGTH( chilNodes );    
     --获取各个子节点的值   
     作者 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 )));    
     修改日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 )));    
     分类 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 2 )));    
     发表日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 3 )));    
     字数 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 4 )));
     录入员 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 5 ))); 
     录入日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 6 ))); 
     日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 7 ))); 
     来源 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 8 )));     
     标题 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 9 ))); 
     正文 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 10 ))); 
     正文字数 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 11 ))); 
     状态 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 12 ))); 
     --插入数据    
     INSERT INTO PEOPLE VALUES (INFO_ID,作者,修改日期,分类,发表日期,字数,录入员,录入日期,日期,来源,标题,正文,正文字数,状态);    
     COMMIT;    
   END LOOP;    
   -- 释放文档对象    
   xmldom.freeDocument(doc);    
   EXCEPTION    
    WHEN OTHERS THEN    
      DBMS_output.PUT_LINE(SQLERRM);    
 END addPerson;   
自己修改完后,在PLSQL里执行总是提示“警告: 创建的过程带有编译错误。”问题可能比较长,谢谢各位大大们帮忙了!!!! 

解决方案 »

  1.   


    <?xml version="1.0" encoding="gbk"?>
    <TRS>
    <REC>
    <INFO_ID>1</INFO_ID><br/><br/>
    <作者>未知</作者><br/><br/>
    <修改日期>未知</修改日期><br/><br/>
    <分类>杂志</分类><br/><br/>
    <发表日期>2009</发表日期><br/><br/>
    <字数>100</字数><br/><br/>
    <录入员>王艳娜</录入员><br/><br/>
    <录入日期>2010.10.19</录入日期><br/><br/>
    <日期>2009</日期><br/><br/>
    <来源>炎黄春秋杂志</来源><br/><br/>
    <标题>新年致读者</标题><br/><br/>
    <正文>在新年将至的时候,许多作者和读者来电来信,询问杂志社的情况和今年的编辑方针,借此机会,我们向大家汇报一下我们的情况和法.</正文><br/><br/>
    <正文字数>88</正文字数><br/><br/>
    <状态>优良</状态><br/><br/>
    </REC></TRS>
    CREATE OR REPLACE PROCEDURE addPerson(file_path VARCHAR2,log_path VARCHAR2)   
     AS   
     --//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节点的值   
    "日期" char(20);
    "分类" char(150);
    "标题" char(2000);
    "正文" varchar2(4000);
    "字数" char(20);
    "正文字数" char(20);
    "录入日期" char(20);
    "录入员" char(20);
    "修改日期" char(20);
    "INFO_ID" char(10);
    "状态" char(50);
    "发表日期" char(50);
    "来源" char(50);
    "作者" char(50)   
     --================================   
     BEGIN   
      xmlPar := xmlparser.newParser;   
      xmlparser.setErrorLog( xmlPar, log_path);   
      xmlparser.parse(xmlPar, file_path);   
      doc := xmlparser.getDocument( xmlPar );   
      -- 释放解析器实例   
      xmlparser.freeParser(xmlPar);   
      -- 获取所有PERSON元素   
      personNodes := xmldom.getElementsByTagName( doc,'REC');   
      len := xmldom.getLength( personNodes );   
      --遍历所有PERSON元素   
      FOR i in 0..len-1   
      LOOP   
      --获取第i个PERSON   
      tempNode := xmldom.item( personNodes, i );   
      --所有属性   
      tempArrMap := xmldom.getAttributes(tempNode);   
      --获取PERSONID的值   
      pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'INFO_ID'));   
      --获取所有子节点   
      chilNodes := xmldom.getChildNodes(tempNode);   
      --获取子节点的个数   
      tmp := xmldom.GETLENGTH( chilNodes );   
      --获取各个子节点的值   
      作者 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 )));   
      修改日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 )));   
      分类 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 2 )));   
      发表日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 3 )));   
      字数 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 4 )));
      录入员 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 5 )));  
      录入日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 6 )));  
      日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 7 )));  
      来源 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 8 )));   
      标题 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 9 )));  
      正文 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 10 )));  
      正文字数 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 11 )));  
      状态 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 12 )));  
      --插入数据   
      INSERT INTO PEOPLE VALUES (INFO_ID,作者,修改日期,分类,发表日期,字数,录入员,录入日期,日期,来源,标题,正文,正文字数,状态);   
      COMMIT;   
      END LOOP;   
      -- 释放文档对象   
      xmldom.freeDocument(doc);   
      EXCEPTION   
      WHEN OTHERS THEN   
      DBMS_output.PUT_LINE(SQLERRM);   
     END addPerson;   
      

  2.   

    ---其他错误你再看看呢CREATE OR REPLACE PROCEDURE addPerson(file_path VARCHAR2,log_path VARCHAR2)   
     AS   
     --//XML解析器   
    .....
    ....."来源" char(50);
    "作者" char(50);          --逗号结束!
     --================================   
     BEGIN   
      xmlPar := xmlparser.newParser;   
      xmlparser.setErrorLog( xmlPar, log_path);   
      xmlparser.parse(xmlPar, file_path);   
      doc := xmlparser.getDocument( xmlPar );   
      -- 释放解析器实例   
      xmlparser.freeParser(xmlPar);   
      -- 获取所有PERSON元素   
      personNodes := xmldom.getElementsByTagName( doc,'REC');   
      len := xmldom.getLength( personNodes );   
      --遍历所有PERSON元素   
      FOR i in 0..len-1   
      LOOP   
      --获取第i个PERSON   
      tempNode := xmldom.item( personNodes, i );   
      --所有属性   
      tempArrMap := xmldom.getAttributes(tempNode);   
      --获取PERSONID的值   
      pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'INFO_ID'));     --pid必须申明变量
      --获取所有子节点   
      chilNodes := xmldom.getChildNodes(tempNode);   
      --获取子节点的个数   
      tmp := xmldom.GETLENGTH( chilNodes );        --tmp也必须申明为变量
      --获取各个子节点的值   
      .......
      .......
      

  3.   


    --就我说的那三个地方改了就好了,编译能通过!---从网上找到的存储过程
    CREATE OR REPLACE PROCEDURE addPerson(file_path VARCHAR2,log_path VARCHAR2)   
     AS   
     --//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节点的值   
    "日期" char(20);
    "分类" char(150);
    "标题" char(2000);
    "正文" varchar2(4000);
    "字数" char(20);
    "正文字数" char(20);
    "录入日期" char(20);
    "录入员" char(20);
    "修改日期" char(20);
    "INFO_ID" char(10);
    "状态" char(50);
    "发表日期" char(50);
    "来源" char(50);
    "作者" char(50);          --(1)逗号结束!
    pid VARCHAR2(100);        --(2)申明变量pid
    tmp VARCHAR2(100);        --(3)申明变量tmp
     --================================   
     BEGIN   
      xmlPar := xmlparser.newParser;   
      xmlparser.setErrorLog( xmlPar, log_path);   
      xmlparser.parse(xmlPar, file_path);   
      doc := xmlparser.getDocument( xmlPar );   
      -- 释放解析器实例   
      xmlparser.freeParser(xmlPar);   
      -- 获取所有PERSON元素   
      personNodes := xmldom.getElementsByTagName( doc,'REC');   
      len := xmldom.getLength( personNodes );   
      --遍历所有PERSON元素   
      FOR i in 0..len-1   
      LOOP   
      --获取第i个PERSON   
      tempNode := xmldom.item( personNodes, i );   
      --所有属性   
      tempArrMap := xmldom.getAttributes(tempNode);   
      --获取PERSONID的值   
      pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'INFO_ID'));     --pid必须申明变量
      --获取所有子节点   
      chilNodes := xmldom.getChildNodes(tempNode);   
      --获取子节点的个数   
      tmp := xmldom.GETLENGTH( chilNodes );        --tmp也必须申明为变量
      --获取各个子节点的值   
      作者 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 )));   
      修改日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 1 )));   
      分类 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 2 )));   
      发表日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 3 )));   
      字数 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 4 )));
      录入员 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 5 )));  
      录入日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 6 )));  
      日期 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 7 )));  
      来源 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 8 )));   
      标题 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 9 )));  
      正文 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 10 )));  
      正文字数 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 11 )));  
      状态 := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 12 )));  
      --插入数据   
      INSERT INTO PEOPLE VALUES (INFO_ID,作者,修改日期,分类,发表日期,字数,录入员,录入日期,日期,来源,标题,正文,正文字数,状态);   
      COMMIT;   
      END LOOP;   
      -- 释放文档对象   
      xmldom.freeDocument(doc);   
      EXCEPTION   
      WHEN OTHERS THEN   
      DBMS_output.PUT_LINE(SQLERRM);   
     END addPerson;   
      

  4.   

    谢谢gelyon帮忙!! 我去plsql中试一下!!
      

  5.   

    刚才在plsql中试了一下! 还是提示“警告: 创建的过程带有编译错误。”我的oracle版本是10G
      

  6.   

    用show errors看看是什么编译错误吧
      

  7.   

    INSERT INTO PEOPLE VALUES (INFO_ID,作者,修改日期,分类,发表日期,字数,录入员,录入日期,日期,来源,标题,正文,正文字数,状态);
    这句可能有问题,看看表结构是否能对应上,建议写成
    insert into table1 (col1, col2) values ('val1','val2');这种形式。
      

  8.   

    你是不是这个INSERT INTO PEOPLE表里不止后面那几个栏位哦?
    我测试的时候是把你这个语句屏蔽了的,所以编译通过了
    你指定插入栏位试试:
    你INSERT INTO PEOPLE(。。)values( ......)
      

  9.   

    你的XML数据一定要用代码导入吗?,如果不一定就用plsql“导入”向导进行导入
      

  10.   

    是自己太粗心了! 往表中多加了个字段! 现在按insert into table1 (col1, col2) values ('val1','val2');方式写就没问题了!!!  存储过程没有问题了! 执行存储过程也没有问题! 但是在oracle的表中没有找到xml中的数据。
      

  11.   

    使用pl/sql developer单步跟踪执行一下,一切都会迎刃而解!!
      

  12.   

    用pl/sql developer  测试了一下 在 call addperson('E:\2.xml','E:\2.log')  提示非法的变量名和编号  在'E:\2.log'提示提示非法的变量名和编号!!!
    这是建表语句:create table test 

    "rowid" char(20), 
    "日期" char(20) default '' not null , 
    "分类" char(150) default '' not null , 
    "标题" char(2000) default '' not null , 
    "正文" varchar2(4000) default '' not null , 
    "字数" char(20) default '' not null , 
    "正文字数" char(20) default '' not null , 
    "录入日期" char(20) default '' not null , 
    "录入员" char(20) default '' not null , 
    "修改日期" char(20) default '' not null , 
    "INFO_ID" char(10) default '' not null, 
    "状态" char(50) default '' not null,
    "发表日期" char(50) default '' not null,
    "来源" char(50) default '' not null,
    "作者" char(50) default '' not null

    哪位大大帮帮忙能不能帮忙测试一下!!谢谢!!!
      

  13.   

    你的是不是符号出问题了?call addperson('E:\2.xml','E:\2.log'
    最后一个)貌似你是中文下的??
      

  14.   

    已经修改过,还是出现上述问题! 在plsqldeveloper test下进行还是出现‘提示非法的变量名和编号’
      

  15.   

    我已经重新发了个帖子!! 这个帖子里我说的比较乱! 新帖的地址:http://topic.csdn.net/u/20101110/13/1d894494-7d9f-4f23-a5c0-f784357f9b2a.html