<fizer>
     <Company CODE="abc">
<VALUE>12345678944555</VALUE>
</Company>
<Company CODE="def">
<VALUE>1011121314156156</VALUE>
</Company>
   </fizer>
根据以上xml文件代码,我的需求如下:编写一个存储过程,当外部参数传送到存储过能内部之后,会根据参数来取对应参数的值。如外部参入为abc的时候,存储过程需要得到对应abc的值,那就是12345678944555.同理如外部参入为def的时候,存储过程需要得到对应def的值,那就是1011121314156156.
以上数据只是测试数据,下面是我参考的代码,希望高人帮我解决一下。 CREATE OR REPLACE PROCEDURE check_Pfizer_Companycode(file_path VARCHAR2,log_path VARCHAR2,vCompanyCode 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 node value
 pid varchar2(4);
 vname varchar2(50); tmp integer;
 --================================
 BEGIN
   xmlPar := xmlparser.newParser;
   xmlparser.setErrorLog( xmlPar, log_path);
   xmlparser.parse(xmlPar, file_path);
   doc := xmlparser.getDocument( xmlPar );  
   -- 
   xmlparser.freeParser(xmlPar);
   -- PERSON element
   personNodes := xmldom.getElementsByTagName( doc, 'PERSON' );
   len := xmldom.getLength( personNodes );
   --loop all PERSON element
   FOR i in 0..len-1
   LOOP
     --PERSON
    tempNode := xmldom.item( personNodes, i );
     --All attribute
     tempArrMap := xmldom.getAttributes(tempNode);
    --get key 
     pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap,'PERSONID'));
    --get value
     chilNodes := xmldom.getChildNodes(tempNode);
     tmp := xmldom.GETLENGTH( chilNodes );
     vname := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item( chilNodes, 0 )));
   END LOOP;
   -- doc
   xmldom.freeDocument(doc);
   EXCEPTION
    WHEN OTHERS THEN
      DBMS_output.PUT_LINE(SQLERRM);
 END addPerson; 

解决方案 »

  1.   

    不是很懂OracleXML,只好帮你顶下了
      

  2.   

    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 
    Connected as SYS
     
    SQL> 
    SQL> --1.使用具有dba权限用户如sys创建一个目录,如:
    SQL> CREATE OR REPLACE DIRECTORY TESTDIR AS 'D:\temp\';
     
    Directory created
    SQL> --2.将读写访问权限赋给需要操作文件的用户,如test用户:
    SQL> GRANT READ,WRITE ON DIRECTORY TESTDIR TO test;
     
    Grant succeeded
     
    SQL> Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 
    Connected as test
     
    SQL> 
    SQL> --3.登录test用户,在其下创建一个函数:
    SQL> CREATE OR REPLACE FUNCTION getCompanyValue(file_path VARCHAR2, company_code VARCHAR2)
      2    RETURN VARCHAR2 IS
      3    --//XML解析器
      4    xmlPar XMLPARSER.parser := XMLPARSER.NEWPARSER;
      5    --//DOM文档对象
      6    doc         xmldom.DOMDocument;
      7    len         INTEGER;
      8    personNodes xmldom.DOMNodeList;
      9    chilNodes   xmldom.DOMNodeList;
     10    tempNode    xmldom.DOMNode;
     11    tempArrMap  xmldom.DOMNamedNodeMap;
     12    --================================
     13    --以下变量用于获取XML节点的值
     14    pid          VARCHAR2(100);
     15    companyValue VARCHAR2(100) := '';
     16    tmp          INTEGER;
     17    --================================
     18  BEGIN
     19    xmlPar := xmlparser.newParser;
     20    xmlparser.parse(xmlPar, file_path);
     21    doc := xmlparser.getDocument(xmlPar);
     22    -- 释放解析器实例
     23    xmlparser.freeParser(xmlPar);
     24    -- 获取所有PERSON元素
     25    personNodes := xmldom.getElementsByTagName(doc, 'Company');
     26    len         := xmldom.getLength(personNodes);
     27    --遍历所有PERSON元素
     28    FOR i IN 0 .. len - 1 LOOP
     29      --获取第i个PERSON
     30      tempNode := xmldom.item(personNodes, i);
     31      --所有属性
     32      tempArrMap := xmldom.getAttributes(tempNode);
     33      --获取PERSONID的值
     34      pid := xmldom.getNodeValue(xmldom.getNamedItem(tempArrMap, 'CODE'));
     35      IF pid = company_code THEN
     36        --获取子元素的值
     37        chilNodes    := xmldom.getChildNodes(tempNode);
     38        tmp          := xmldom.GETLENGTH(chilNodes);
     39        companyValue := xmldom.getNodeValue(xmldom.getFirstChild(xmldom.item(chilNodes, 0)));
     40        EXIT;
     41      END IF;
     42    END LOOP;
     43    -- 释放文档对象
     44    xmldom.freeDocument(doc);
     45    RETURN companyValue;
     46  EXCEPTION
     47    WHEN OTHERS THEN
     48      DBMS_output.PUT_LINE(SQLERRM);
     49  END getCompanyValue;
     50  /
     
    Function created
    SQL> --4.将company.xml文件复制到数据服务器的D:\temp\目录下
    SQL> --5.测试该函数
    SQL> var companyValue varchar2(100);
    SQL> exec :companyValue := getCompanyValue('TESTDIR\company.xml','abc');
     
    PL/SQL procedure successfully completed
    companyValue
    ---------
    12345678944555
    SQL> print companyValue
    companyValue
    ---------
    12345678944555
     
    SQL> 附:company.xml文件<?xml version="1.0"?>
    <fizer>
       <Company CODE="abc">
    <VALUE>12345678944555</VALUE>
    </Company>
    <Company CODE="def">
    <VALUE>1011121314156156</VALUE>
    </Company>
    </fizer>
    注意:上面是10g的演示,如果是oracle9i,则是设置utl_file_dir参数,重启数据库使参数生效,如
    alter system set utl_file_dir='D:\temp' scope=spfile;调用:
    SQL>exec :companyValue := getCompanyValue('D:\temp\company.xml','abc');
      

  3.   

    谢谢你的回复,我刚才进行了方法的创建但是提示了错误。
    错误的具体代码是
    PLS-00201: 識別子XMLPARSER.PARSERを宣言してください。
    应该是没有安装这个XMLPARSER包。我用的是9.2版本,请问怎么解决这个问题
      

  4.   

    谢谢你的回复,我刚才进行了方法的创建但是提示了错误。
    错误的具体代码是
    PLS-00201: 識別子XMLPARSER.PARSERを宣言してください。
    应该是没有安装这个XMLPARSER包。我用的是9.2版本,请问怎么解决这个问题
      

  5.   


    是不是你当前用户没有使用 XMLPARSER的权限啊?
    GRANT EXECUTE ON XMLPARSER TO scott;
      

  6.   

    identifier 'XMLPARSER.PARSER' must be declared 
    这个错误
      

  7.   

    你的包没有安装,可以在路径:$ORACLE_HOME\rdbms\admin下找到下列脚本,使用sys执行安装
    dbmsxml.sql
    dbmsxmld.sql
    dbmsxmlp.sql
    dbmsxmlt.sqlprvtxml.plb
    prvtxmld.plb
    prvtxmlp.plb
    prvtxmlt.plb
      

  8.   

    4楼的方法,经验证,这个在10gr2中是可以运行的,
    但是要注意,建dir时要用sys;