<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;
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');
错误的具体代码是
PLS-00201: 識別子XMLPARSER.PARSERを宣言してください。
应该是没有安装这个XMLPARSER包。我用的是9.2版本,请问怎么解决这个问题
错误的具体代码是
PLS-00201: 識別子XMLPARSER.PARSERを宣言してください。
应该是没有安装这个XMLPARSER包。我用的是9.2版本,请问怎么解决这个问题
是不是你当前用户没有使用 XMLPARSER的权限啊?
GRANT EXECUTE ON XMLPARSER TO scott;
这个错误
dbmsxml.sql
dbmsxmld.sql
dbmsxmlp.sql
dbmsxmlt.sqlprvtxml.plb
prvtxmld.plb
prvtxmlp.plb
prvtxmlt.plb
但是要注意,建dir时要用sys;