Oracle 获取多项目序列

Oracle 获取多项目序列,oracle,xmltable,oracle-xml-db,Oracle,Xmltable,Oracle Xml Db,我的意图是“选择容器号等于输入数据的数据”(一种搜索功能)。我在尝试检索数据时遇到了一个问题,在以下情况下出现了一个问题: d:goodsShipments/d:consignment/d:transportEquipment/d:id/text() 这里我得到了多个数据。我不知道如何在where条件下迭代它 我的问题是: 我的源XML是: 如何选择sealId为5678的所有声明? 在这种情况下,如何处理where条件?每批货物有多个容器,从原始XML中提取后,将基于LRN进行过滤;因此,您

我的意图是“选择容器号等于输入数据的数据”(一种搜索功能)。我在尝试检索数据时遇到了一个问题,在以下情况下出现了一个问题:

d:goodsShipments/d:consignment/d:transportEquipment/d:id/text()
这里我得到了多个数据。我不知道如何在where条件下迭代它

我的问题是:

我的源XML是:

如何选择sealId为5678的所有声明?
在这种情况下,如何处理where条件?

每批货物有多个容器,从原始XML中提取后,将基于LRN进行过滤;因此,您需要使用嵌套的XMLTable对象。第一个从声明中获取数据,并将托运作为子XML类型提取。然后将其传递给第二个XMLTable,后者提取容器信息

选择x1.lrn、x1.username、x2.containerNumber
来自DMSU decl d
交叉连接XMLTable(
XMLNAMESPACES(默认值'http://www.xxxx.invalid/xxxx/xxx/schema/xxx',
'http://www.xxxx.invalid/xxx/schema/common'作为“c”,
'http://www.xxxx.invalid/xxxx/xxx/schema/xxx“作为“d”),
“/d:声明”
传递d.object\u值
柱
lrn VARCHAR2(35字符)
路径“c:declarationHeader/c:localReferenceNumber/text()”,
用户名字符(25)
路径“c:declarationHeader/c:username/text()”,
寄售类型
路径“d:货物装运/d:寄售”
)x1
交叉连接XMLTable(
XMLNAMESPACES(默认值'http://www.xxxx.invalid/xxxx/xxx/schema/xxx',
'http://www.xxxx.invalid/xxx/schema/common'作为“c”,
'http://www.xxxx.invalid/xxxx/xxx/schema/xxx“作为“d”),
“//d:运输设备”
托运
柱
containerNumber VARCHAR2(35字符)
路径'd:id/text()'
)x2
其中x1.lrn='NLDMS1111150010950';
使用(更新的)示例XML,将生成:

LRN                                 USERNAME                  CONTAINERNUMBER                   
----------------------------------- ------------------------- -----------------------------------
NLDMS111111150010950                testSC testSC             abcd                               
NLDMS111111150010950                testSC testSC             bcde                               
NLDMS111111150010950                testSC testSC             cdef                               
NLDMS111111150010950                testSC testSC             defg                               
NLDMS111111150010950                testSC testSC             efgh                               
希望这就是你想看到的


您也可以使用更复杂的XPath将其保存在单个XMLTable中,但我认为这更清楚。

您可以使用下面的查询来迭代并从容器组件获取id

SELECT x1.lrn, x1.username, x2.containerNumber
FROM dmsimport_decl d
CROSS JOIN XMLTable(
  XMLNAMESPACES(DEFAULT 'http://www.SSSSSSS/dmsimport',
    'http://www.SSSSSSScommon' AS "c",
    'http://www.SSSSSSSS/dmsimport' AS "d"),
  '/d:declaration'
  PASSING d.object_value
  COLUMNS
    lrn VARCHAR2(35 CHAR)
      PATH 'c:declarationHeader/c:localReferenceNumber/text()',
    username CHAR(25)
      PATH 'c:declarationHeader/c:username/text()',
    containerComponent XMLType
      PATH 'd:goodsShipments/d:goodsItems'
) x1.
CROSS JOIN XMLTable(
  XMLNAMESPACES(DEFAULT 'http://www.SSSSSSSSS/dmsimport',
    'http://www.SSSSSS/common' AS "c",
    'http://www.SSSSSSSS/dmsimport' AS "d"),
  '//d:containerComponent'
  PASSING x1.containerComponent
  COLUMNS
    containerNumber VARCHAR2(35 CHAR)
      PATH 'd:id/text()'
) x2
WHERE x1.lrn = 'NL123456789160000464';

您的示例XML不完整或无效。您的
323
名称空间不匹配<代码>无结束标记;它没有
声明
本地引用编号
等。;查询的其他部分似乎与那里的结构不匹配。很难用错误的信息来解释你在做什么。嗨,Alex,添加了从数据库中获取的新xml好的,我已经更新了我的答案以使用你的示例;唯一真正的变化是
/c:declaration
变成
/d:declaration