2.5.3 位置指示子
HiRDB/SDは,操作中のレコードや親子集合を識別するための情報を保持します。この情報を位置指示子といいます。HiRDB/SDでは,位置指示子を使用してレコードや親子集合に対する操作を行います。
(1) レコードの位置づけ
レコードの検索や格納などを行うと,そのレコードの位置情報が位置指示子に保持されます。これをレコードの位置づけといいます。レコードの位置づけは,ルートレコードから開始して,操作対象とするレコードまで位置づけます。
SDBデータベースにアクセスする場合は,操作の基点となるレコードを検索し,レコードに位置指示子を位置づけます。操作の対象としたいレコードに位置指示子を位置づけることで,以後の操作で,そのレコードを基点にSDBデータベースを操作できます。
レコードの更新や削除をする場合は,直前に位置づけられたレコードを対象とします。そのため,レコードの位置づけを行わないで,レコードの更新やレコードの削除はできません。
また,4V FMBのSDBデータベースのルートレコードを削除する場合は,構成要素名にDBKEYを指定した=条件の検索で位置づけを行う必要があります。
- 参考
-
レコードの一括削除や複数レコードの検索では,レコードの位置づけは不要です。
(3) 位置指示子の生成と消滅
位置指示子は個別開始時(SDBデータベース単位の操作開始時)にレコード型,親子集合型ごとに生成され,個別終了時(SDBデータベース単位の操作終了時)およびトランザクション終了時に消滅します。
(4) 位置指示子の状態
通常,位置指示子は操作中のレコードや親子集合を識別するための情報を保持します。ここでは位置指示子の特殊な状態について説明します。
(a) 空値
位置指示子がどのレコードも指していないか,または位置指示子に親子集合中のレコードを検索するために必要な情報が設定されていない状態を空値といいます。
個別開始時点の位置指示子は空値となります。個別開始後,SDBデータベースを操作することによって,レコードを識別するために必要な情報が位置指示子に設定されます。
(b) 親子集合位置指示子に設定されるレコード
親子集合位置指示子に設定されるレコードは,最後に操作したレコードが親レコードか子レコードかによって異なります。
-
最後に操作したレコードが親レコードの場合
親レコードが設定されます。子レコードに対する親子集合位置指示子は空値となります。
-
最後に操作したレコードが子レコードの場合
子レコード,およびその子レコードに関連づけられている親レコードが設定されます。
(c) 下位の位置指示子の設定
下位の位置指示子とは,対象レコードの下位のレコード位置指示子,親子集合位置指示子のことです。
レコードBを対象としたときの下位の位置指示子の例を次に示します。図中の点線部分が下位の位置指示子になります。
下位の位置指示子の設定内容はレコードの位置づけ方法によって異なります。
-
レコード型内の検索,親子集合型内の検索,およびレコードの格納の場合
下位の位置指示子はクリアされ空値となります。
-
位置指示子指定の検索の場合
下位の位置指示子は変更されません。
(d) 子レコード削除後の親子集合位置指示子の状態(複合状態)
子レコードを削除した場合,削除した子レコードの位置によって,子レコードの削除後に親子集合位置指示子が保持する情報が異なります。このときの親子集合位置指示子の状態を複合状態といいます。
中間のレコードを削除した場合,親子集合位置指示子では,削除した子レコードの前後のレコードの位置情報を保持します。ただし,先頭の子レコードを削除した場合は,削除した子レコードの次のレコードの位置情報だけを保持します。また,最後尾の子レコードを削除した場合は,削除した子レコードの前のレコードの位置情報だけを保持します。
子レコードを削除した場合の親子集合位置指示子の状態の例を次の図に示します。
(5) エラー発生時の位置指示子の状態
SDBデータベースの操作でエラーが発生した場合,エラーが発生したレコード型のレコード位置指示子は次のどちらかの状態になります。
-
エラーが発生する前の状態
-
空値
また,親子集合位置指示子についても同様です。このため,エラー発生後も同一トランザクション内でSDBデータベースの操作を続ける場合は,必要に応じて位置指示子を位置づけ直してから,SDBデータベースの操作を行ってください。