1

我的意图是“选择容器编号等于输入数据的数据”(搜索功能的种类)。当我尝试检索数据时遇到问题,在 where 条件下出现问题:

d:goodsShipments/d:consignment/d:transportEquipment/d:id/text()

在这里,我得到了多个数据。我不知道如何在 where 条件下迭代它。

我的查询是:

我的源 XML 是:

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

4

2 回答 2

3

每个货物有多个容器,并且在从原始 XML 中提取 LRN 后基于 LRN 进行过滤;所以你需要使用嵌套的 XMLTable 对象。第一个从声明中获取数据并将货物提取为子 XMLType。然后将其传递给提取容器信息的第二个 XMLTable。

SELECT x1.lrn, x1.username, x2.containerNumber
FROM dmsimport_decl d
CROSS JOIN XMLTable(
  XMLNAMESPACES(DEFAULT 'http://www.xxxx.invalid/xxxx/xxx/schema/xxx',
    'http://www.xxxx.invalid/xxx/schema/common' AS "c",
    'http://www.xxxx.invalid/xxxx/xxx/schema/xxx' 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()',
    consignment XMLType
      PATH 'd:goodsShipments/d:consignment'
) x1
CROSS JOIN XMLTable(
  XMLNAMESPACES(DEFAULT 'http://www.xxxx.invalid/xxxx/xxx/schema/xxx',
    'http://www.xxxx.invalid/xxx/schema/common' AS "c",
    'http://www.xxxx.invalid/xxxx/xxx/schema/xxx' AS "d"),
  '//d:transportEquipment'
  PASSING x1.consignment
  COLUMNS
    containerNumber VARCHAR2(35 CHAR)
      PATH 'd:id/text()'
) x2
WHERE x1.lrn = 'NLDMS111111150010950';

使用您的(更新的)示例 XML,将产生:

LRN                                 USERNAME                  CONTAINERNUMBER                   
----------------------------------- ------------------------- -----------------------------------
NLDMS111111150010950                testSC testSC             abcd                               
NLDMS111111150010950                testSC testSC             bcde                               
NLDMS111111150010950                testSC testSC             cdef                               
NLDMS111111150010950                testSC testSC             defg                               
NLDMS111111150010950                testSC testSC             efgh                               

希望这是你想看到的。

快速 SQL Fiddle 演示

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

于 2015-04-29T11:43:02.653 回答
0

您可以使用以下查询来迭代并从容器组件中获取 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';
于 2016-06-14T12:38:42.530 回答