0

先週抱えていた Java の問題に対する回答が得られたので (ありがとう!)、DB2 に関する新しい問題に取り掛かりました... 私が取り組んでいる Java アプリは、Web フォームからデータを取得し、 DB2 ファイル (データベース)。Java PreparedStatement オブジェクトに渡される SQL 文字列は次のとおりです。

insert into EVCRPTFL (
        AUID, URLEX, URNEX, URNAME, URRCPT, URRUN, URRECT, URRECS, URRDYS, URRWKS, URRMHS, URRMTH, URRDAY, URRTHE, URRWHT, URRWDY, UREXPT, UROCRM, UROCRN, UREXPR, URSTTS, URACTV, URRPT, URD1YR, URD1YN, URD1MR, URD1MN, URD1DR, URD1DN, URD2YR, URD2YN, URD2MR, URD2MN, URD2DR, URD2DN, URRPAR, URLANG, URCTRY
    )
    values (
        ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
    )

テーブル作成スクリプトは次のとおりです。

CREATE TABLE EVCRPTFL (
    URID int NOT NULL,
    AUID decimal(11,0) NOT NULL,
    URLEX timestamp,
    URNEX timestamp,
    URNAME varchar(40) NOT NULL,
    URRCPT varchar(500) NOT NULL,
    URRUN timestamp,
    URRECT char(1) NOT NULL,
    URRECS int NOT NULL,
    URRDYS int NOT NULL,
    URRWKS int NOT NULL,
    URRMHS int NOT NULL,
    URRMTH int NOT NULL,
    URRDAY int NOT NULL,
    URRTHE int NOT NULL,
    URRWHT int NOT NULL,
    URRWDY int NOT NULL,
    UREXPT int NOT NULL,
    UROCRM int NOT NULL,
    UROCRN int NOT NULL,
    UREXPR timestamp,
    URSTTS char(1) NOT NULL,
    URACTV timestamp,
    URRPT int NOT NULL,
    URD1YR int,
    URD1YN int,
    URD1MR int,
    URD1MN int,
    URD1DR int,
    URD1DN int,
    URD2YR int,
    URD2YN int,
    URD2MR int,
    URD2MN int,
    URD2DR int,
    URD2DN int,
    URRPAR varchar(1000),
    URLANG char(2),
    URCTRY char(2)
);

CREATE UNIQUE INDEX EVCRPTFL ON EVCRPTFL(URID);

ご覧のとおり、最初の URID を除く SQL 文字列のすべての値を渡しています。レコードが挿入された後、ID 番号とともにデータベースで確認できます。これは、データベースが URID を自動的に追加していることを意味します (つまり、ID は Java コードで生成されてからデータベースに渡されません)。 )。以前の Oracle と PHP の経験では、Oracle Sequences を使用して自動番号付けされたフィールドを作成しました。また、MySQL、Postgres、およびおそらく他のデータベース システムにもほぼ同様の機能があることは認識していますが、その方法を見つけることができませんでした。自動番号付けは DB2 で機能します。

DB2 に詳しい私の同僚も当惑しています。彼が見たところによると、テーブルにはトリガーが設定されていないと言い、一般的に、ここの RPG コードでは、データベースによって生成されるのではなく、ID 番号がコード内で生成されてからデータベースに渡されるように聞こえます。自体。

だから私の質問は: URID の一意のインデックスも ID 番号を自動生成しますか、それともデータベースまたは Java コードで探す必要があるものがありますか?

そして、私のフォローアップの質問は、関連データを格納する別のテーブルに挿入するために、URID 番号を最終的に使用する必要があるということです。Oracle では、これは「insert into return into」で行われ、コード内のパラメータ化された id_variable からデータが取り戻されました。DB2 に同様の機能はありますか? IDENTITY_VAL_LOCAL 関数に関するドキュメントを見つけましたが、たとえば、最初の挿入と IDENTITY_VAL_LOCAL の呼び出しの間に Web フォームから別の挿入が発生した場合など、正しい ID が返されることを常に保証できるとは思えません...

必要に応じて、コード サンプルやその他のデータベース情報を提供できます。ありがとう!

4

1 に答える 1

0

URID の一意のインデックスは、ID 番号を自動生成しません。

これを行う DB2 の方法は、GENERATED BY DEFAULT または GENERATED ALWAYS を URID 列定義に追加することです。

URID int NOT NULL
  GENERATED BY DEFAULT AS IDENTITY( START WITH 1, INCREMENT BY 1 )
  UNIQUE

GENERATED BY DEFAULT を使用すると、必要に応じてカスタム値を指定できます。

CREATE TABLEステートメントのドキュメントを参照することをお勧めします。

于 2010-12-28T22:36:21.400 に答える