PL / SQL使用XMLQuery / XQuery在特定点将一个XML文档中的元素插入另一个XML文档中

时间:2017-10-30 16:36:34

标签: xml plsql xquery

我想知道是否有人可以帮忙吗?

我正在尝试将一个xml文档中的所有元素(根级别)插入到另一个xml文档中。两个文档都作为XMLType列驻留在Oracle 12c表中。我希望能够从他们的表中读取它们,执行转换,然后将其作为新文档写入表中。大部分内容都是直截了当的,但是我在插入XQuery操作时遇到了问题...我天真地想象这会很简单,但似乎无法正确。在Oracle 12c之前,我能够使用appendchildxml函数:

select
appendchildxml(my_output, '/Message', my_other_file, 'xmlns="SFA/ILR/2016-17"') into my_output
from
dual;

但是在Oracle 12c中不推荐使用该函数,所以我现在需要使用XQuery。

update xml_testing_12c
set 
my_ilrxml = 
XMLQuery('
xquery version "1.0";

copy $ilr := .
modify
    insert nodes $dp_out/Destinations/node() as last into $ilr/Message
return $ilr
'
passing my_ilr, my_dpoutcome as "dp_out" returning content
)
where
run_number = (select max(run_number) from xml_testing_12c);

my_ilr和my_dpoutcome是包含我的有效XML文档的PL / SQL XMLType变量。它们具有以下结构:

my_ilr如下:

<Message xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="SFA/ILR/2016-17" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="SFA/ILR/2016-17">
  <Header>
  <CollectionDetails>
   </CollectionDetails>
  <Source>
   </Source>
  </Header>
  <LearningProvider>
   </LearningProvider>
  <Learner>
    <LearningDelivery>
     </LearningDelivery>
  </Learner>
</Message>

my_dpoutcome如下:

<Destinations>
  <LearnerDestinationandProgression>
    <LearnRefNumber></LearnRefNumber>
    <ULN></ULN>
    <DPOutcome>
      <OutType></OutType>
      <OutCode></OutCode>
      <OutStartDate></OutStartDate>
      <OutCollDate></OutCollDate>
    </DPOutcome>
  </LearnerDestinationandProgression>
</Destinations>

父节点中有大量​​的LearnerDestinationandProgression元素。

我收到以下错误:

ORA-19112:评估期间出错: XVM-01155:[XUDY0027]目标表达式无效 ORA-06512:第286行

非常感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

XUDY0027 - 意思是。你试图插入一些东西。

您的xmls具有不同的命名空间。 1)消息有xmlns =“SFA / ILR / 2016-17”
2)目的地有xmlns =“oracle的一些默认URL”

当您在xmlquery中处理两个xmls时,此表达式$ilr/Message将返回null。因为在默认命名空间中没有元素Message。

快速修复:* - 任何命名空间;

insert nodes $dp_out/Destinations as last into $ilr/*:Message

更优雅的方式是命名空间声明。

xquery version "1.0";
declare namespace ns="SFA/ILR/2016-17";
copy $ilr := .
modify
    insert nodes $dp_out/Destinations  as last into $ilr/ns:Message
return $ilr
'