热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle使用PL/SQL从嵌套的xml节点读取xml数据

在开始管理器循环之前,您将返回到原始文档,而不是仅仅选择这些节点在我看来,您只需替换makeNode(l_doc)调用即可:dbms_xslprocessor.selectNode

你好,汤姆,

我是xml的新手,不懂Java ,不幸的是,我现在没有时间学习它,因为我需要在几天内完成一个小的原型。我做了很多阅读和审查许多OTN参考,但我不能解决我的问题。可能是因为我知道的不够多。我使用的是Oracle 11g。
我还想在PL/SQL中完成这些工作。我的要求是:
1)我在服务器位置“MYDIR”中有一个xml文件('test.xml')
2)我要读取xml数据并存储到DB表中
3)我使用'BFILENAME'实用程序将xml数据加载到'BFILE'中,并使用'dbms_xmlparser'实用程序解析xml数据。
4)还使用'dbms_xsl处理器'实用程序来处理xml节点
5)我可以从外部循环中的外部xml节点读取'Personals_Record'详细信息('Cur_emp') ,但当我试图从内部循环中的嵌套xml节点读取'Manager_Record'详细信息时('Cur_mgr') ,它非常难读取相应的嵌套节点。我的代码在单个迭代中不断读取“Manager_Record”的全部详细信息(从上到下)。
然后控制从内环开始,开始外环的第二次迭代。
6)最终,它在第二次迭代中再次读取了完整的“Manager_Record”详细信息(从上到下)。我相信,是因为节点初始化
“人员记录”的节点初始化-->'/DATA_DS/G_1/G_2/FILE_FRAGS/HCM_Transaction_and_Foundation_Data_to_EBS/人员/人员_Re弦

Manager_Record的节点初始化-->'/DATA_DS/G_1/G_2/FILE_FRAGS/HCM_Transaction_and_Foundation_Data_to_EBS/人员/人员记录/工作分配/工作分配/记录/经理/经理记录'
7)一旦它读取了特定人员的相应的“Manager_Record”,它就必须存在于内部循环中。

我包含了一个XML文档类型的示例和我正在处理的代码。
'test.xml'是




1



Foundation Data




123

Ram

EMP


A123
BC
LINE_MANAGER


LINE_MANAGER_ONE
Line manager one name
Line manager one number




XX_SUPERVISOR_ONE
Supervisor one name
Supervisor one number









124

John

EMP


A124
AC
LINE_MANAGER


LINE_MANAGER_TWO
Line manager two name
Line manager two numb




XX_SUPERVISOR_TWO
Supervisor two name
Supervisor two numb









124

Miller

EMP


A124
IC
LINE_MANAGER


LINE_MANAGER_THREE
Line manager three name
Line manager three numb




XX_SUPERVISOR_THREE
Supervisor three name
Supervisor three numb









125

Rose

EMP


A125
BC
LINE_MANAGER


LINE_MANAGER_FOUR
Line manager four name
Line manager four numb




XX_SUPERVISOR_FOUR
Supervisor four name
Supervisor four numb












代码是

DECLARE
v_bfile BFILE ;
l_clob CLOB;
l_parser dbms_xmlparser.Parser;
l_doc dbms_xmldom.DOMDocument;
l_nl dbms_xmldom.DOMNodeList;
l_n dbms_xmldom.DOMNode;
l_nl1 dbms_xmldom.DOMNodeList;
l_n1 dbms_xmldom.DOMNode;
l_temp_holder1 varchar2(500);
l_temp_holder2 varchar2(500);
l_temp_holder3 varchar2(500);
l_temp_holder4 varchar2(500);
l_temp_holder5 varchar2(500);
l_temp_holder6 varchar2(500);
l_temp_holder7 varchar2(500);
l_truncator number := 0;
l_count number := 0;
l_count1 number := 0;
BEGIN
DBMS_OUTPUT.PUT_LINE ('*Starting*');
v_bfile := BFILENAME( 'MYDIR', 'test.xml' );
dbms_lob.createtemporary(l_clob, cache=>FALSE);
dbms_lob.open(v_bfile, dbms_lob.lob_readonly);
dbms_lob.loadFromFile(dest_lob => l_clob, src_lob => v_bfile, amount => dbms_lob.getLength(v_bfile));
dbms_lob.close(v_bfile);
l_parser := dbms_xmlparser.newParser;
dbms_xmlparser.parseClob(l_parser, l_clob);
l_doc := dbms_xmlparser.getDocument(l_parser);
dbms_lob.freetemporary(l_clob);
dbms_xmlparser.freeParser(l_parser);
l_nl := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(l_doc),'/DATA_DS/G_1/G_2/FILE_FRAGMENT/Foundation_Data/Persons/Persons_Record');
FOR cur_emp IN 0 .. dbms_xmldom.getLength(l_nl) - 1
LOOP
l_n := dbms_xmldom.item(l_nl, cur_emp);
DBMS_OUTPUT.PUT_LINE ('*Main LOOP* Itteration - '||l_count1 );
dbms_xslprocessor.valueOf(l_n,'Person_Number/text()',l_temp_holder1);
dbms_xslprocessor.valueOf(l_n,'Person_Type/text()',l_temp_holder2);
dbms_xslprocessor.valueOf(l_n,'Assignments/Assignments_Record/Assignment_Number/text()',l_temp_holder3);
dbms_xslprocessor.valueOf(l_n,'Assignments/Assignments_Record/Assignment_Manager_Type/text()',l_temp_holder4);
l_nl1 := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(l_doc),'/DATA_DS/G_1/G_2/FILE_FRAGMENT/Foundation_Data/Persons/Persons_Record/Assignments/Assignments_Record/Managers/Manager_Record');
FOR cur_mgr IN 0 .. dbms_xmldom.getLength(l_nl1) - 1
LOOP
l_n1 := dbms_xmldom.item(l_nl1, cur_mgr);

dbms_xslprocessor.valueOf(l_n1,'Manager_Type/text()',l_temp_holder5);
dbms_xslprocessor.valueOf(l_n1,'Manager_Name/text()',l_temp_holder6);
dbms_xslprocessor.valueOf(l_n1,'Manager_Number/text()',l_temp_holder7);
DBMS_OUTPUT.PUT_LINE (' mgr type- '||l_temp_holder5);
DBMS_OUTPUT.PUT_LINE (' mgr name- '||l_temp_holder6);
DBMS_OUTPUT.PUT_LINE (' mgr numb- '||l_temp_holder7);
l_count := l_count+1;
IF MOD(l_count,2) <> 0 THEN

EXIT;
END IF;
END LOOP;
l_count1 := l_count1+1;
END LOOP;
DBMS_OUTPUT.PUT_LINE ('*Ending*');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('Error '||SQLCODE||SQLERRM);
END;
/
SHOW ERR;


什么是实现此目的的好方法? ,我想在PL/SQL中实现此目的。我已经使用了许多实用程序和测试用例( dbms_xsl处理器、XML TABLE、ExtractValue等,但我一直没有太多运气).
如有任何帮助,我们将不胜感激。谢谢你。
最诚挚的问候,拉姆

专家解答


在开始管理器循环之前,您将返回到原始文档,而不是仅仅选择这些节点
在我看来,您只需替换makeNode(l_doc)调用即可:

dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(l_doc),'/DATA_DS/G_1/G_2/FILE
_FRAGMENT/Foundation_Data/Persons/Persons_Record/Assignments/Assignments_Record/
Managers/Manager_Record');

作为当前节点:

dbms_xslprocessor.selectnodes ( l_n ,'Assignments/Assignments_Record/Managers/Manager_Record' ) ;

修修你的路;)

declare
v_bfile bfile ;
l_clob clob;
l_parser dbms_xmlparser.parser;
l_doc dbms_xmldom.domdocument;
l_nl dbms_xmldom.domnodelist;
l_n dbms_xmldom.domnode;
l_nl1 dbms_xmldom.domnodelist;
l_n1 dbms_xmldom.domnode;
l_temp_holder1 varchar2 ( 500 ) ;
l_temp_holder2 varchar2 ( 500 ) ;
l_temp_holder3 varchar2 ( 500 ) ;
l_temp_holder4 varchar2 ( 500 ) ;
l_temp_holder5 varchar2 ( 500 ) ;
l_temp_holder6 varchar2 ( 500 ) ;
l_temp_holder7 varchar2 ( 500 ) ;
l_truncator number := 0;
l_count number := 0;
l_count1 number := 0;
begin
dbms_output.put_line ( '*Starting*' ) ;
v_bfile := bfilename ( 'TMP', 'test.xml' ) ;
dbms_lob.createtemporary ( l_clob, cache=>false ) ;
dbms_lob.open ( v_bfile, dbms_lob.lob_readonly ) ;
dbms_lob.loadfromfile ( dest_lob => l_clob, src_lob => v_bfile, amount => dbms_lob.getlength ( v_bfile ) ) ;
dbms_lob.close ( v_bfile ) ;
l_parser := dbms_xmlparser.newparser;
dbms_xmlparser.parseclob ( l_parser, l_clob ) ;
l_doc := dbms_xmlparser.getdocument ( l_parser ) ;
dbms_lob.freetemporary ( l_clob ) ;
dbms_xmlparser.freeparser ( l_parser ) ;
l_nl := dbms_xslprocessor.selectnodes (
dbms_xmldom.makenode ( l_doc ) ,
'/DATA_DS/G_1/G_2/FILE_FRAGMENT/HCM_Transaction_and_Foundation_Data_to_EBS/Persons/Persons_Record' ) ;
for cur_emp in 0 .. dbms_xmldom.getlength ( l_nl ) - 1
loop
l_n := dbms_xmldom.item ( l_nl, cur_emp ) ;
dbms_output.put_line ( '*Main LOOP* Itteration - '||l_count1 ) ;
dbms_xslprocessor.valueof ( l_n,'Person_Number/text()',l_temp_holder1 ) ;
dbms_xslprocessor.valueof ( l_n,'Person_Type/text()',l_temp_holder2 ) ;
dbms_xslprocessor.valueof ( l_n,'Assignments/Assignments_Record/Assignment_Number/text()',l_temp_holder3 ) ;
dbms_xslprocessor.valueof ( l_n,'Assignments/Assignments_Record/Assignment_Manager_Type/text()',l_temp_holder4 ) ;
l_nl1 := dbms_xslprocessor.selectnodes ( l_n ,'Assignments/Assignments_Record/Managers/Manager_Record' ) ;
for cur_mgr in 0 .. dbms_xmldom.getlength ( l_nl1 ) - 1
loop
l_n1 := dbms_xmldom.item ( l_nl1, cur_mgr ) ;
dbms_xslprocessor.valueof ( l_n1,'Manager_Type/text()',l_temp_holder5 ) ;
dbms_xslprocessor.valueof ( l_n1,'Manager_Name/text()',l_temp_holder6 ) ;
dbms_xslprocessor.valueof ( l_n1,'Manager_Number/text()',l_temp_holder7 ) ;
dbms_output.put_line ( 'mgr type- '||l_temp_holder5 ) ;
dbms_output.put_line ( 'mgr name- '||l_temp_holder6 ) ;
dbms_output.put_line ( 'mgr numb- '||l_temp_holder7 ) ;
l_count := l_count+1;
if mod ( l_count,2 ) <> 0 then
exit;
end if;
end loop;
l_count1 := l_count1+1;
end loop;
dbms_output.put_line ( '*Ending*' ) ;
exception
when others then
dbms_output.put_line ( 'Error '||sqlcode||sqlerrm ) ;
end;
/
*Starting*
*Main LOOP* Itteration - 0
mgr type- LINE_MANAGER_ONE
mgr name- Line manager one name
mgr numb- Line manager one
number
*Main LOOP* Itteration - 1
mgr type- LINE_MANAGER_TWO
mgr name- Line manager two
name
mgr numb- Line manager two
numb
mgr type- XX_SUPERVISOR_TWO
mgr name- Supervisor two
name
mgr numb- Supervisor two
numb
*Main LOOP* Itteration - 2
mgr type- LINE_MANAGER_THREE
mgr name- Line manager three
name
mgr numb- Line manager three
numb
mgr type- XX_SUPERVISOR_THREE
mgr name- Supervisor three
name
mgr numb- Supervisor three
numb
*Main LOOP* Itteration - 3
mgr type- LINE_MANAGER_FOUR
mgr name- Line manager four
name
mgr numb- Line manager four
numb
mgr type- XX_SUPERVISOR_FOUR
mgr name- Supervisor four
name
mgr numb- Supervisor four
numb
*Ending*


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了在使用MSXML解析XML文件时出现DTD禁用问题的解决方案。通过代码示例和错误信息获取方法,解释了默认情况下DTD是禁用的,以及如何启用DTD的方法。此外,还提到了网上关于该问题的信息相对较少,因此本文提供了解决方案以供参考。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
author-avatar
wangxin7299b_943
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有