oracle读取xml的信息问题

jiang_jiajia10 2010-11-02 12:45:43

<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;



...全文
1378 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hei3tian 2011-10-26
  • 打赏
  • 举报
回复
好东东。。收藏再说。。。。。
gadflyyy 2011-02-22
  • 打赏
  • 举报
回复
4楼的方法,经验证,这个在10gr2中是可以运行的,
但是要注意,建dir时要用sys;
jiang_jiajia10 2010-11-03
  • 打赏
  • 举报
回复
谢谢你的回复,我刚才进行了方法的创建但是提示了错误。
错误的具体代码是
PLS-00201: 識別子XMLPARSER.PARSERを宣言してください。
应该是没有安装这个XMLPARSER包。我用的是9.2版本,请问怎么解决这个问题
tangren 2010-11-03
  • 打赏
  • 举报
回复
你的包没有安装,可以在路径:$ORACLE_HOME\rdbms\admin下找到下列脚本,使用sys执行安装
dbmsxml.sql
dbmsxmld.sql
dbmsxmlp.sql
dbmsxmlt.sql

prvtxml.plb
prvtxmld.plb
prvtxmlp.plb
prvtxmlt.plb
jiang_jiajia10 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gelyon 的回复:]
引用 7 楼 jiang_jiajia10 的回复:

引用 4 楼 tangren 的回复:
SQL code
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS

SQL>
SQL> --1.使用具有dba权限用户如sys创建一个目录,如:
SQL> C……
[/Quote]
identifier 'XMLPARSER.PARSER' must be declared
这个错误
gelyon 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jiang_jiajia10 的回复:]

引用 4 楼 tangren 的回复:
SQL code
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 TE……
[/Quote]

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

jiang_jiajia10 2010-11-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tangren 的回复:]
SQL code
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\'……
[/Quote]
谢谢你的回复,我刚才进行了方法的创建但是提示了错误。
错误的具体代码是
PLS-00201: 識別子XMLPARSER.PARSERを宣言してください。
应该是没有安装这个XMLPARSER包。我用的是9.2版本,请问怎么解决这个问题
  • 打赏
  • 举报
回复
学习,收藏
tangren 2010-11-02
  • 打赏
  • 举报
回复
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');
zkl516321905 2010-11-02
  • 打赏
  • 举报
回复
mark,等高手来看看吧。
gelyon 2010-11-02
  • 打赏
  • 举报
回复
不是很懂OracleXML,只好帮你顶下了

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧