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 として委託を抽出します。これは、コンテナー情報を抽出する 2 番目の 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 に答える