Symfoware Server アプリケーション開発ガイド(埋込みSQL編) - FUJITSU - |
目次 索引 |
第3章 アプリケーションの作成 |
ここでは、行識別子の概要と注意事項について説明します。
行識別子(疑似列)は、データベース中の任意の表の行を一意に識別するためのものです。行識別子名は、“ROW_ID”です。行識別子は、単一行SELECT文またはFETCH文により取り出すことができます。取り出した行識別子は、探索条件に指定して任意の行を操作するために使用します。
行識別子を使用することにより、データベース中の単一行を高速に操作することができます。また、あらかじめ検索した集合の任意の行を一意に識別して操作することができます。
例
行識別子を使用して行の更新を行います。
EXEC SQL BEGIN DECLARE SECTION; ROW_ID H_RID; EXEC SQL END DECLARE SECTION; : EXEC SQL SELECT ROW_ID INTO :H_RID FROM 在庫管理.在庫表 WHERE 製品番号 = 351; : EXEC SQL UPDATE 在庫管理.在庫表 SET 倉庫番号 = 3 WHERE ROW_ID = :H_RID;
行識別子を使用する場合の注意事項を、以下に示します。
行識別子を使用したアプリケーションのコンパイルでは、sqlcc、sqlfccおよびsqlcobolコマンドに、-W96オプションまたは-W2000オプションを指定してください。
単一行SELECT文やカーソルを使用したFETCH文で取り出した行識別子を、SQLデータ操作文のWHERE句の探索条件に指定する場合、SQLデータ操作文は、行識別子を取り出した単一行SELECT文やカーソルが識別する問合せ式と同じ表を操作する必要があります。取り出した行識別子を、異なる表を操作するデータ操作の探索条件に指定すると、検索データは見つかりません。
取り出した行識別子は、そのトランザクション内で再検索または更新に使用することができます。ただし、トランザクションの独立性水準により同一トランザクション内においても、同じデータを検索できなかったり、異なる行を更新してしまうことがあります。
独立性水準 |
同一行の操作 |
---|---|
SERIALIZABLE |
同一行の操作を保証します。 |
REPEATABLE READ |
同一行の操作を保証します。 |
READ COMMITTED |
以下のいずれかの条件で取得した行識別子は、再検索で異なる行を識別することがあります。
|
READ UNCOMMITTED |
再検索で異なる行を識別することがあります。 |
取り出した行識別子を、他のトランザクションで再検索または更新に利用すると、同じデータを検索できなかったり、異なる行を更新することがあります。このような場合は、行識別子を取り出したときに行のデータも同時に取り出しておき、行識別子を利用して更新する前に、行識別子で再検索して行のデータが他のトランザクションにより変更されていないかどうかを調べる必要があります。
事 象 |
原 因 |
---|---|
検索データなし |
該当行が、他のトランザクションにより削除または更新されています。 |
前回の検索結果と値が異なる |
他のトランザクションにより行が更新されています。 他のトランザクションにより行が削除されたあと、別の行が挿入されています。 |
目次 索引 |