1

DB2 とストアド プロシージャは初めてです。テーブルを更新するストアド プロシージャを DB2 に記述したいと考えています。このプロシージャーは、入力パラメーターとして XML 文書を持っています。

XML の各レコードをループし、いくつかのノードを選択して、テーブル内の対応する行を更新する必要があります。このストアド プロシージャは、テーブルのバッチ更新に使用されます。

プロシージャーの疑似コードがありますが、DB2 でどのように表示されるかわかりません。

INPUT XML は FORMAT です

<Root>
  <Record>
    <a>1234</a>
    <b>1</b>
    <c>2</c>
    <d>A</d>
    <e>B</e>
    <f>C</f>
  </Record>
<Record>
    <a>1235</a>
    <b>1</b>
    <c>2</c>
    <d>A</d>
    <e>B</e>
    <f>C</f>
  </Record>
</Root>

手順は次のようになります

CREATE PROCEDURE UPDATE_BATCH (IN INDOC XML)
P1: BEGIN

FOR rec AS rec CURSOR FOR(
SELECT 
Record.XMLQUERY('//Record/a/text()') AS A, 
Record.XMLQUERY('//Record/b/text()') AS B,
Record.XMLQUERY('//Record/c/text()') AS C,
Record.XMLQUERY('//Record/d/text()') AS D,
Record.XMLQUERY('//Record/e/text()') AS E,
Record.XMLQUERY('//Record/f/text()') AS F
FROM
TABLE (INDOC)Record--Not Sure how to construct table from input xml
)
DO
UPDATE XYZ.TEMP_TABLE
SET ACOL=Record.A,
BCOL=Record.B,
CCOL=Record.C,
DCOL=Record.D,
ECOL=Record.E
WHERE
FCOL=Record.F;
END FOR;
END P1

上記の手順を作成するのを手伝ってください。DB2 で ForEach、XML ノード処理、CURSOR、および LOOPING の正しい構文を取得できません。

答え

CREATE PROCEDURE UPDATE_BATCH(IN DOC XML)
BEGIN
MERGE INTO XYZ.TEMP_TABLE AS T
USING (SELECT X.* FROM 
XMLTABLE('$d/Root/Record' passing DOC as "d"
COLUMNS 
        "A" VARCHAR(10) PATH 'a',
        "B" VARCHAR(10) PATH 'b',
        "C" VARCHAR(10) PATH 'c',
        "D" VARCHAR(10) PATH 'd',
        "E" VARCHAR(10) PATH 'e',
        "F" VARCHAR(10) PATH 'f' 
) AS X) AS XT
ON T.FCOL=XT."F"
WHEN MATCHED THEN
UPDATE
SET
T.ACOL=XT."A",
T.BCOL=XT."B",
T.COL=XT."C"
END
4

1 に答える 1

0

Db2 は XML データを適切にサポートしているため、XML をシュレッドして 1 つ以上のテーブルに適用する方法についていくつかのオプションがあります。

探している関数はXMLTABLE です。これは、XML を 1 つの表形式の結果セットに分割する最も柔軟な方法です。

入力 XML ドキュメントに複数のテーブルに移動する必要があるデータが含まれている場合、DECOMPOSE XML DOCUMENTステートメントは強力ですが、各入力 XML ノードのリレーショナル ターゲットを指定する特別な注釈を含む事前登録済みの XML スキーマ ドキュメント (XSD) が必要です。さらに、DECOMPOSE XML DOCUMENTステートメントは永続テーブルにしか書き込むことができず、最終的な宛先に書き込まれる前にデータをステージングおよび調整するためによく使用される宣言済みグローバル一時テーブル(DGTT) には書き込めません。

カーソルを使用して断片化されたデータを適用する場合、ループ全体を、結果セットを入力式として使用する 1 つのMERGEステートメントに置き換えることができます。「アップサート」処理にXMLTABLEDb2 のステートメントを使用する方法を示す例はたくさんあります。この処理では、指定されたキーが宛先テーブルに既に存在するかどうかに応じて、またはによって各着信行が適用されます。MERGEINSERTUPDATE

于 2012-04-22T20:20:25.980 に答える