2.3.7 SDBデータベースアクセス
SDBデータベースアクセスについて説明します。なお,提供APIについては,マニュアル「TP1/Financial Service Platform プログラム作成の手引」を参照してください。
- 〈この項の構成〉
(1) FMB階層アクセス
データベース種別がFMBの場合,レコードアクセスは階層順(親→子→孫…)に行う必要があり,階層を飛ばす(親→孫など)とするとエラーとなります。レコード検索/追加を行うと,そのレコードの子レコードに対してアクセス可能になります。同一レコード型の別レコードに対して検索/追加を行うと,前回レコードの子レコードはアクセス不可となり,今回アクセスしたレコードの子レコードにアクセス可能となります。
(2) キー
同一SDB内またはレコード種別内でレコードを一意に識別するため,レコードごとにキーが設定されています。キーは,構造型DB機能を使用するHiRDBが管理するデータベースキーと,ユーザが管理するユーザキーに分けられます。
項番 |
キー種別 |
説明 |
---|---|---|
1 |
データベースキー |
SDBが管理するキー。キー値は,ユーザが定義またはレコード追加時に明示的に指定するキーと,SDBが自動的に採番するキー(一連番号)があります。SDBデータベース定義のレコードの定義で,構成要素集合「DBKEY」がデータベースキーとなります。 |
2 |
ユーザキー |
ユーザが管理するキー。キー値は,レコード追加時にユーザが指定します。ユーザフィールド内に含まれます。SDBデータベース定義のレコードの定義で,TYPEが「U,K」の構成要素がユーザキーとなります。 |
HiRDBのSDBデータベース定義の例を次に示します。この例では,「KEYTENBAN+KEYKUBUN+KEYNUM」がデータベースキー,「USERDC2」がユーザキーとなります。
RECORD NCTRSEG1 …レコード名 2 KEYDBMEI CHARACTER 4 TYPE D,L …DB名 2 DBKEY …データベースキー 3 KEYTENBAN XCHARACTER 3 TYPE K,A …店番(論理キー) RDエリア分割キー 3 KEYKUBUN XCHARACTER 4 TYPE K,R …区分(論理キー) レコード分割キー 3 KEYNUM INTEGER TYPE K,N …一連番号(論理キー) 2 USERDC1 XCHARACTER 8 TYPE U,D …ユーザデータ 2 USERDC2 XCHARACTER 8 TYPE U,K …ユーザキー 3 USERDC3 XCHARACTER 8 TYPE U,F …ユーザファイル通番
(3) 論理キー
データベースキーを複数の構成要素に区切り,それぞれの構成要素の属性および値を事前に決めておくことができます。この区切られた構成要素を論理キーと呼びます。
論理キーの属性として次の属性があり,これらを組み合わせることによって柔軟なDB構成を実現できます。
項番 |
論理キー種別 |
説明 |
---|---|---|
1 |
RDエリア分割キー |
RDエリア分割に使用するキー。 |
2 |
レコード分割キー |
レコード分割に使用するキー。 |
3 |
RDエリアおよびレコード分割キー |
RDエリア分割およびレコード分割に使用するキー。 |
4 |
上記以外 |
上記以外でユーザが任意に使用するキー。 |
5 |
一連番号 |
HiRDBが採番するキー。 |
(4) レコード選択
SDBデータベースアクセスを行う場合,アクセス対象となるレコードを選択する必要があります。選択方法は,インタフェースエリアのエントリ部で指定します。
レコード検索/追加を行う場合は,レコードを選択する範囲および範囲内での特定方法を指定し,対象となるレコードを選択します。
レコード更新/削除を行う場合は,直前にレコード検索/追加したレコードが対象となります。レコード検索/追加を行わないで,レコード更新/削除はできません。
(5) レコード検索範囲
インタフェースエリアのエントリ部の指示コードおよび検索コードによって,対象レコードの検索範囲を指定します。指示コードでは,レコードの検索開始位置(先頭/終端/現在レコード位置の前後/USERポインタ)を指定し,検索コードで検索方向(前方/後方)を指定します。ただし,レコード特定方法によっては,レコード検索範囲が無視されます。
●が検索の基点を示し,矢印が検索の方向を示します。レコード特定方法が指定されていない場合は,●のレコードを操作対象レコードとします。レコード特定方法が指定されている場合は,●のレコードから矢印の方向にレコードを走査し条件に一致するレコードを操作対象レコードとします。
項番 |
位置情報 |
説明 |
---|---|---|
1 |
先頭ポインタ |
DBKEY(一連番号除く)内のレコードの先頭。ユーザキーなし時は最も古いレコード,ユーザキーあり時はユーザキーの最も小さいレコード |
2 |
終端ポインタ |
DBKEY(一連番号除く)内のレコードの終端。ユーザキーなし時は最も新しいレコード,ユーザキーあり時はユーザキーの最も大きいレコード |
3 |
USERポインタ |
ユーザがレコード位置を特定するために任意で設定できるポインタであり,DBKEY(一連番号除く)単位に設定できます。使用有無はSDBデータベース定義で指定します。レコード更新/追加/削除によってUSERポインタが操作できます。 |
4 |
現在レコード位置 |
最後にレコード検索/追加したレコード |
(6) レコード特定方法
レコード検索範囲内で,どのようにレコードを特定するか指定します。特定方法として次の方法があります。
-
レコードの一意識別情報(DBKEY,ユーザキーなど)を指定し一致するレコードを対象とする
-
条件式に該当する最初のレコードを対象とする
-
特定位置(先頭/終端/USERポインタ)にあるレコードを対象とする
-
前回検索したレコードの前後レコードを対象(シーケンシャルアクセス)とする
(7) 複数レコードの検索
複数レコードの検索は,ルートレコード以下のすべてのレコードを一括で取得します。一括で検索することで,レコードの検索(1件のレコードを検索する)の要求回数増加に伴うオーバーヘッドを抑えることができます。
データベース種別がFMBの場合だけ可能です。RDエリアを指定することで,店群順アクセスを行うことができます。
複数レコードの検索を行う場合は,個別開始時に複数レコードの検索専用オプションを指定します。
検索条件は,指示コード'F'指定の要求時に指定します。以降,指示コード'N'または'S'指定の要求を繰り返すことによって,指定された検索条件の範囲内で,後続レコードを順次検索します。
ルートレコード下のレコードがデータ格納エリアに収まる場合は,SDHステータスコード0で終了します。この場合,指示コード'N'または'S'指定の要求を行うと,次ルートセグメントのレコードを検索します。
ルートレコード下のレコードがデータ格納エリアに収まりきらない場合は,SDHステータスコード10072で終了します。この場合,指示コード'N'指定の要求を行うと,当該ルートレコード下の後続レコードを検索します。指示コード'S'指定の要求を行うと,次ルートセグメントのレコードを検索します。
複数レコードの検索では,検索方法として,ダイレクトとシーケンシャルをサポートしており,個別開始時に複数レコードの検索専用オプションで指定します。
(a) ダイレクト
指示コード'F'指定時に指定された検索条件の範囲だけを検索します。検索条件を満たさなくなったらNOT FOUNDでリターンします。また,終端に達するとNOT FOUNDでリターンします。
(b) シーケンシャル
指示コード'F'指定時に指定された検索条件に合致するレコードが存在する場合は,検索条件に関係なく終端まで検索します。終端に達するとNOT FOUNDでリターンします。
指示コード'F'指定時に指定された検索条件に合致するレコードが存在しない場合は,NOT FOUNDでリターンします。
シーケンシャル指定の検索は,検索条件に終了条件が含まれる場合に有効となります。終了条件が含まれない場合は,ダイレクト指定の検索と同じ動作となります。
(8) 個別開始/終了一括要求
SDBデータベースアクセス(検索),かつ,個別開始/終了一括要求オプションに'Y'を指定した場合,SDBデータベースアクセス(検索)の要求内で個別開始と個別終了を実行します。
個別開始/終了一括要求オプションを指定しない場合は,「個別開始→DBアクセス(検索)→個別終了」と3回のAPIを発行する必要があります。しかし,本オプションを指定した場合は,「DBアクセス(検索)」を行うだけで検索処理を行うことができるようになります(個別開始/個別終了のAPI発行は不要となります)。これによって,HiRDBとの通信オーバーヘッドを減らすことができます。
詳細は,マニュアル「HiRDB Version 9 Structured Data Access Edition」の「レコードの検索」の「個別開始/終了一括要求オプションを指定したレコードの検索」を参照してください。
(9) 個別開始実行要求
システム構成表示/DBアクセス/一括削除の各API発行時,個別開始実行要求オプションに'Y'を指定している場合,そのインタフェースエリアでの個別開始が未実行であれば,各APIの延長で個別開始を実行します。個別開始が実行済みであれば,このオプションを無視します。
個別開始実行要求オプションを指定しない場合は,各API発行前に個別開始APIを発行する必要があります。このオプションを指定することで個別開始APIの発行が不要となり,HiRDB/SDとの通信オーバーヘッドを減らすことができます。