2

DB2 データベースに接続し、SQL ステートメントを実行しています。

行われていることの一例は次のとおりです。

select field from library/file
  [program code line finishes executing]
  [increment value by one]
update library/file set field = 'incremented value'

値を返しながらすぐに値を更新する必要があります。スクリプトが完了するのを待ってから、別の UPDATE ステートメントを実行する必要はありません。

私がやりたいことのコンセプトはこれです:

select field from library/file; update library/file set field = (Current Value + 1); go;

注意してください... これは、最もよく知られている一般的な SQL データベースではなく、IBM i 上の DB2 データベースです。

ありがとう!

4

3 に答える 3

4

このファイルが単にカウンターを格納する単一の行を持つことを意図している場合は、DB2 SEQUENCEを使用して次に使用可能な番号を管理することを検討してください。それが SEQUENCE が行うように設計されていることです。

セットアップするには、CREATE SEQUENCEステートメントを使用します。

値をインクリメントして取得するには、形式のSEQUENCE 参照式を使用しますNEXT VALUE FOR sequence-name。最新の値を調べるには、 を使用しPREVIOUS VALUE FOR sequence-nameます。これらの式は、SELECT ステートメントや INSERT ステートメントなどで、通常の任意の列式のように使用できます。

たとえば、請求書番号に対してこれを行いたいとします (また、経理部門が最初の請求書番号を 000001 にしたくない場合があるため、最初の請求書番号をより高く初期化します)。

CREATE SEQUENCE InvoiceSeq
    as decimal (7,0)
    start with 27000; -- for example

次のような新しい請求書の番号を取得できます。

SELECT NEXT VALUE FOR InvoiceSeq
    INTO :myvar
    FROM SYSIBM/SYSDUMMY1;

しかし、この SYSIBM/SYSDUMMY1 テーブルは何ですか? テーブルから実際には何も得られないのに、なぜそうするふりをしているのですか? SELECT には FROM テーブル句が必要です。しかし、必要ないので、VALUES INTOステートメントを使用しましょう。

VALUES NEXT VALUE FOR InvoiceSeq
    INTO :myvar;

これでカウンターがインクリメントされ、値が変数に入れられました。その値を使用して、InvoiceHeaders および InvoiceDetails テーブルに INSERT できます。

または、InvoiceHeader の書き込み時にカウンターをインクリメントし、InvoiceDetails の書き込み時に再度使用することもできます。

INSERT INTO InvoiceHeaders 
           (InvoiceNbr,                Customer, InvoiceDate)
    VALUES (NEXT VALUE FOR InvoiceSeq, :custnbr, :invdate);

for each invoice detail
   INSERT INTO InvoiceDetails 
              (InvoiceNbr,                    InvoiceLine, Reason,   Fee)
       VALUES (PREVIOUS VALUE FOR InvoiceSeq, :line,      :itemtxt,  :amt);

PREVIOUS VALUE は特定のジョブに対してローカルであるため、別のジョブが同じ番号を取得するリスクはありません。

于 2013-01-16T23:20:11.247 に答える
1
update library/file set field = field + 1;
select field from library/file; 
[program code line finishes executing]
[increment value by one]

これは、別のアプリがそれをフェッチしてから更新するまでの間に番号を更新する問題を処理します。更新してからご利用ください。2つのアプリが同時に更新しようとすると、1つは待機します。

SEQUENCEオブジェクトはまさにこの目的のために設計されていますが、この「次のID」ファイルを更新し続ける必要がある場合は、これが私が行う方法です。SEQUENCEオブジェクトに関する情報については、@ Clockwork-Museによるコメントのリンクをたどるか、V5R4からこの例を試してください。

于 2013-01-16T20:34:14.363 に答える