このファイルが単にカウンターを格納する単一の行を持つことを意図している場合は、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 は特定のジョブに対してローカルであるため、別のジョブが同じ番号を取得するリスクはありません。