DL/I関数の呼び出し
本章では、DL/I関数の使用方法について説明します。
1. DL/I関数
DL/I(Data Language/I)は、COBOLまたはPL/I言語で作成されたアプリケーションでHiDBにアクセスするために呼び出すインターフェース・モジュールです。つまり、一般のアプリケーションがHiDBのデータを検索または更新するためには、DL/Iが提供する機能と形式に従って呼び出す必要があります。
次は、COBOLで使用するDL/I呼び出し文の構文です。
CALL 'CBLTDLI' USING DLI-function PCB-mask Segment-io-area Segment-search-arguments
CBLTDLIは、COBOLでDL/Iを呼び出す際に使用されるインターフェース・モジュール名です。
次は、COBOLでAIBを使用して呼び出すDL/I呼び出し文の構文です。
CALL 'AERTDLI' USING DLI-function AIB-mask Segment-io-area Segment-search-arguments
AERTDLIは、COBOLでAIBを使用してDL/Iを呼び出す際に使用するインターフェース・モジュール名です。
次は、PL/Iで使用するDL/I呼び出し文の構文です。
CALL 'PLITDLI' ( Parameter count DLI-function PCB-mask Segment-io-area Segment-search-arguments )
PLITDLIは、PL/IでDL/Iを呼び出す際に使用されるインターフェース・モジュール名です。
DL/I関数の呼び出し時に渡すパラメータは事前に適切な値を設定します。DL/I呼び出しは、呼び出し文と呼び出しに必要な各種の情報を含んでいるパラメータで構成されます。
以下は、DL/I呼び出しに使用されるパラメータです。Paramter countは、PLITDLIモジュールを使用する場合にのみ記述します。
パラメータ | 説明 |
---|---|
Parameter count |
PLITDLIモジュールでのみ使用するパラメータです。このパラメータ以外のパラメータの数を記述します。 |
DLI-function |
セグメントの検索、挿入、削除、更新などDL/Iが提供する様々な機能の中で、アプリケーションで使用したい機能を定義します。 |
PCB-mask |
アプリケーションでDL/Iを呼び出した後に返されるステータス・コード、セグメント名などを格納するために定義されたデータ構造体パラメータです。 |
Segment-io-area |
セグメントの検索後に返されるデータを格納するか、セグメントの挿入・更新のためのデータをDL/Iに渡すために使用します。 |
Segment-search-arguments |
検索または処理したい特定のセグメントの検索条件を記述します。1つ以上のセグメント名と条件文で構成されます。 |
AIB-mask |
アプリケーションでAERTDLIインターフェースを使用してDL/Iを呼び出した後に返されるリターンコードとPCBマスク・アドレスを保存するために定義されたデータ構造体パラメータです。 |
2. DL/I機能
DL/I呼び出し文の最初のパラメータを使ってDL/Iで提供する各種機能の中から使用したい機能を設定します。DL/Iが提供する機能は、大きく3つに分けることができます。
-
Get
データベースからセグメントのデータを検索するために使用する機能です。
機能 説明 GU(Get Unique)
*GHU(Get Hold Unique)
特定のセグメントを直接検索します。順次処理する最初のセグメント・インスタンスの位置を指定する際に使用します。検索する対象の条件は、SSAパラメータに記述します。
GN(Get Next)
*GHN(Get Hold Next)
セグメントを順次検索します。現在の位置から階層パスに従って次のセグメント・インスタンスに移動して検索します。
GNP(Get Next in Parent)
*GHNP(Get Hold Next in Parent)
GNと同様な機能であり、親セグメントに従属するセグメントのみを順次検索します。親セグメントはGU機能によって検索されたセグメントで事前に設定されます。
-
Update
データベースにデータを挿入、修正、削除するために使用する機能です。
機能 説明 ISRT (Insert)
セグメントに新規データを追加する際に使用します。
DLET (Delete)
セグメントのデータを削除する際に使用します。
REPL (Replace)
セグメントのデータを変更する際に使用します。
-
その他
システム・サービスに関連する機能です。
機能 説明 CHKP, SYMCHKP(Checkpoint)
RDBのコミットと類似しており、プログラムによって変更されたすべての内容をデータベースに適用します。SYMCHKP(シンボリック・チェックポイント)で渡されたアドレスのデータをバックアップします。
XRST(Extended Restart)
SYMCHKPでバックアップしたデータを元のアドレスに戻します。
SYNC(Synchronization Checkpoint)
CHKPと同じ機能を実行します。
ROLL, ROLB(Rollback)
最後のコミット以降のすべてのデータ変更をロールバックします。ROLLの場合、終了コードのU007788を使用してプログラムを終了します。
APSB(Allocate PSB)
使用するリソース(PSB)をロードしてメモリを割り当てます。AERTDLIインターフェースを使用してDL/I関数を呼び出す前に、この機能を呼び出す必要があります。
DPSB(Deallocate PSB)
APSBを使用して割り当てたリソースを解除します。AERTDLIインターフェースの使用を終了するときに呼び出されます。
*H(Hold)文字が付いているGet機能はセグメントを修正(REPL)、削除(DLET)する前に使用される機能です。REPLとDLET機能を呼び出す前に必ずH文字が付いているGet機能を使用してセグメントを検索する理由は、他のユーザーによって当該データが修正、削除されないようにロックをかけるためです。 |
3. PCBマスク
IMSシステムでは、アプリケーションのDL/I関数の呼び出しの結果情報をPCBに設定します。アプリケーションは、PCB構造を含んでいるPCBマスクとPCBマスクの各フィールドを参照して、DL/I呼び出しへの成功または失敗を確認することができます。
DL/I呼び出しの2番目のパラメータであるPCBマスクは、Database name、Segment level number、Status Codeなどの9つの項目で構成されており、開発者はその中から5つの項目を参照します。特にStatus Codeは、DL/Iの呼び出しに関する処理結果コードが格納される項目であり、アプリケーションで処理結果に基づいて作業を分岐するときに比較対象として頻繁に使用されます。
segment level numberまたはsegment name項目は、DL/Iが最終的に作業したセグメントの情報が格納されるので、非修飾GNまたはGNPの呼び出しで最後に検索したセグメントを確認することができます。また、エラーが発生した場合も、この情報を参照してエラーの対象セグメントを把握できます。
以下は、COBOLプログラムで実装したPCBマスクの例です。
01 SEGMENT1-PCB-MASK. 05 SPCB-DBD-NAME PIC X(8). 05 SPCB-SEGMENT-LEVEL PIC X(2). 05 SPCB-STATUS-CODE PIC X(2). 05 SPCB-PROC-OPTIOINS PIC X(4). 05 FILLER PIC S9(5) COMP. 05 SPCB-SEGMENT-NAME PIC X(8). 05 SPCB-KEY-LENGTH PIC S9(5) COMP. 05 SPCB-NUMB-SENS-SEGS PIC S9(5) COMP. 05 SPCB-KEY PIC X(11).
以下は、PCBマスクの各フィールドについての説明です。
フィールド名 | 長さ(バイト) | 説明 |
---|---|---|
Database name |
8 |
アクセスしたセグメントが属しているデータベース名が格納されます。 |
Segment level number |
2 |
データベース内の現在のセグメント・レベル数です。アクセスしたセグメントがルート・セグメントの場合、01が格納されます。 |
Status Code |
2 |
DL/Iの呼び出し後に関数の処理結果に対するステータス・コードが設定されます。詳細については、DL/Iステータス・コードを参照してください。 |
Processing options |
4 |
プログラムで使用可能な呼び出しタイプのコードが設定されます。プログラムで実行可能な処理を示すコードであり、PSBGENを実行する際にPROCOPTパラメータに指定した値が渡されます。 |
Reserved for IMS |
4 |
IMSが内部的に使用するフィールドであり、アプリケーションでは使用しません。 |
Segment name |
8 |
正常に呼び出しが終了した場合、アクセスしたセグメントの中から最後のセグメント名が設定されます。呼び出しに失敗した場合は、要求したセグメントの中で最後のセグメント名が格納されます。 |
Length of key |
4 |
Key feedback areaの現在の長さが格納されます。 |
Number of sensitive segments |
4 |
バイナリ・フィールドであり、アプリケーションが検知できるセグメント・タイプの番号が格納されます。 |
Key feedback area |
var length |
検索または挿入時にアクセスしたセグメントの連結キー(Concatenated key)が格納されます。連結キーとは、アクセスした全レベルのセグメント・キー・フィールド値を順次に組み合わせたキーです。 |
3.1. ステータス・コード
ステータス・コードは、DL/I呼び出しの処理結果の情報を示すコードです。アプリケーションでこの情報を参照して適切な処理を行います。DL/I呼び出しが正常に完了すると、空白の値を返します。
以下は、主なステータス・コードについての説明です。
コード | 説明 |
---|---|
GA |
最下位レベルのセグメント・レコードを読み込んだ後、次の上位セグメントを読み込む前に返されるコードです。修飾呼び出しでは発生しません。最下位の階層セグメントのインスタンスがそれ以上存在しない場合に発生しますが、処理には影響を与えない情報性コードです。 |
GB |
順次検索される際、階層パスに従ってすべてのデータを検索し、データベースの最後に達したときに返されるコードです。データベースの最後を示すコードであり、GNでは発生しますが、GNPでは発生しません。 |
GE |
提示した条件に一致するセグメント・インスタンスを検索できない場合に返されるコードです。 |
GK |
非修飾GNあるいはGNPを呼び出すとき、同じ階層レベルで異なるセグメント・タイプが見つかった場合に返されるコードです。処理には影響を与えない情報性コードです。 |
GAとGKは、処理が正常に完了した場合に返される情報性ステータス・コードです。これらは頻繁に返されるコードなので、その概念を熟知しておく必要があります。 |
以下は、各関数ごとに返される主なステータス・コードです。各ステータス・コードの詳細については、DL/Iステータス・コードを参照してください。
GU/GHU | GN/GHN | GNP/GHNP | REPL/DLET | ISRT | |
---|---|---|---|---|---|
GA |
− |
○ |
○ |
− |
− |
GB |
− |
○ |
− |
− |
− |
GE |
○ |
○ |
○ |
− |
− |
GK |
− |
○ |
○ |
− |
− |
4. AIBマスク
AERTDLIインターフェースでは、AIBマスクを使用してDL/I関数を呼び出します。
アプリケーションは、IMSシステムにアクセスするために使用するリソース名をAIBマスクに設定します。AERTDLIでは、PCBマスクのアドレスがAIBマスクに渡され、アプリケーションによって参照されます。
以下は、COBOLプログラムに実装されたAIBマスクの例です。
01 AIB. 05 AIBRID PIC x(8). 05 AIBRLEN PIC 9(9) USAGE BINARY. 05 AIBRSFUNC PIC x(8). 05 AIBRSNM1 PIC x(8). 05 AIBRSNM2 PIC x(8). 05 AIBRESV1 PIC x(8). 05 AIBOALEN PIC 9(9) USAGE BINARY. 05 AIBOAUSE PIC 9(9) USAGE BINARY. 05 AIBRESV2 PIC x(12). 05 AIBRETRN PIC 9(9) USAGE BINARY. 05 AIBREASN PIC 9(9) USAGE BINARY. 05 AIBERRXT PIC 9(9) USAGE BINARY. 05 AIBRESA1 USAGE POINTER. 05 AIBRESA2 USAGE POINTER. 05 AIBRESA3 USAGE POINTER. 05 AIBRESV4 PIC x(40). 05 AIBRSAVE OCCURS 18 TIMES USAGE POINTER. 05 AIBRTOKN OCCURS 6 TIMES USAGE POINTER. 05 AIBRTOKC PIC x(16). 05 AIBRTOKV PIC x(16). 05 AIBRTOKA OCCURS 2 TIMES PIC 9(9) USAGE BINARY.
次は、AIBマスクの各フィールドについての説明です。ただし、HiDB AERTDLIで使用されるフィールドについてのみ説明しています。
フィールド名 | 長さ(バイト) | 説明 |
---|---|---|
Resource name |
8 |
APSB、DPSBを呼び出す場合は、PSB名を指定する必要があります。他のDL/Iを呼び出す場合には、PCB名を指定します。 (例: AIBRSNM1、AIBRSNM2) |
Resource address |
DL/I関数を呼び出した後、PCBマスクのアドレスが返されます。 (例: AIBRESA1、AIBRESA2..) |
|
Return code |
4 |
AIBTDLIのリターンコードが返されます。成功の場合は0が返され、その他の場合はエラーコードが返されます。 (例:AIBRETRN) |
5. SSA
SSA(Segment Search Argument)は、DL/I呼び出しに対する処理プロセスで必要な条件情報が含まれているパラメータです。RDBのWHERE句と同様な機能です。DL/I呼び出し時にSSA内に1つ以上の条件文が存在するかどうかによって、非修飾呼び出しと修飾呼び出しに分類されます。
5.1. 非修飾SSA
アクセス対象のセグメント名のみを指定する場合に使用します。セグメント名の最大長は8バイトであり、末尾に1つの空白を追加します。セグメント名が8バイトより小さい場合は、残りの部分を空白で埋めます。
その形式は以下のとおりです。

以下は、COBOLプログラムで実装した非修飾SSAの例です。
01 UNQUALIFIED-SSA. 05 UNQUAL-SSA-SEGMENT-NAME PIC X(08). 05 FILLER PIC X VALUE SPACE.
5.2. 修飾SSA
特定の値を有するセグメントにアクセスするには、フィールドの条件文を記述した修飾SSAを使用します。その形式は以下のとおりです。

-
セグメント名
アクセスするセグメント名を指定します。
-
フィールド名
条件の比較対象となるセグメントのフィールド名を指定します。フィールド名はDBDスクリプトのFIELDに記述されているフィールド名と一致する必要があります。
-
関係演算子
指定したフィールドと検索値との関係を示す演算子を指定します。演算子の長さは2バイトであり、指定できる演算子は以下のとおりです。
関係 演算子 一致(Equal to)
EQ
=□
□=
不一致(Not equal to)
NE
^=
=^
超過(Greater than)
GT
>□
□>
以上(Greater than or equal to)
GE
>=
=>
未満(Less than)
LT
<□
□<
以下(Less than or equal to)
LE
<=
=<
□は1Byteの空白を意味します。
-
検索値
フィールド名に対応する値であり、指定値を基準にして関係演算処理を行います。
以下は、COBOLプログラムで実装した修飾SSAの例です。
01 SEGMENT-SSA. 05 FILLER PIC X(9) VALUE 'SEGMENT1('. 05 FILLER PIC X(10) VALUE 'SEG1CODE ='. 05 SEG1-SSA-CODE PIC X(3). 05 FILLER PIC X VALUE ')'.
5.3. コマンド・コード
SSA内の指定された位置にコマンド・コードを設定すると、DL/I関数の様々な機能を拡張して使用できます。コマンド・コードは1つの文字で表し、SSA内のセグメント名の次の位置である9バイトの位置にコマンド・コードの指示子であるアスタリスク(*)を設定してから、10バイトの位置に使用したいコマンド・コードを設定します。
コマンド・コードは非修飾SSAと修飾SSAの両方に使用可能であり、使用形式は以下のとおりです。
-
非修飾SSAの形式
単一コマンド・コードを持つ非修飾SSA形式 -
修飾SSAの形式
単一コマンド・コードを持つ修飾SSA形式
以下は、COBOLプログラムでコマンド・コードを使用して非修飾SSAを実装した例です。
01 UNQUALIFIED-SSA. 05 UNQUAL-SSA-SEGMENT-NAME PIC X(08). 05 FILLER PIC X VALUE “*”. 05 UNQUAL-SSA-COMMAND-CODE PIC X VALUE “-”. 05 FILLER PIC X VALUE SPACE.
以下は、使用可能なコマンド・コードの一覧です。
コード | 説明 |
---|---|
C |
複数セグメントのキー・フィールド値を連続して指定した連結キーを使用して、データを検索または挿入します。 |
D |
Path callとも呼ばれており、階層パスに従って指定したセグメントに順次アクセスし、アクセスしたすべてのセグメントのデータをI/O領域に順番に返します。 |
F |
セグメントの最初の位置を意味します。検索や挿入の処理時にセグメントの最初の位置で指定した作業を行います。つまり、Get Nextは、Get Uniqueのように動作します。 |
L |
セグメントの最後の位置を意味します。検索や挿入の処理時にセグメントの最後で指定した作業を行います。 |
*M |
サブセット・ポインターを次のセグメント・インスタンスに移動させます。 |
N |
REPLの呼び出し時に使用されるコマンド・コードです。Dコマンド・コードによってpath callで検索されたデータの更新を防止するために使用されます。 |
P |
特定のセグメントに親セグメントを設定して、GNPの呼び出し時に使用できるようにします。一般的にアクセスしたセグメントの中で最下位レベルのセグメントが親セグメントとして設定されますが、Pコマンド・コードを使ってそれより上位レベルのセグメントを親セグメントとして設定できます。Pコマンド・コードを使用したGET要求が失敗した場合にも、Pコマンド・コードが指定されたセグメント・レベルまでの検索に成功したら、そのレベルを親セグメントとして設定します。 |
Q |
検索したセグメントの内容が別のプログラムで更新されることを防ぐ目的で使用されます。 |
*R |
最初のサブセットが指すセグメントのデータを検索します。 |
*S |
現在の位置を無条件にサブセット・ポインターに設定します。 |
U |
現在のセグメントの位置を維持させます。セグメントを検索した場合、目的のデータが検索されるか、それ以上のデータが存在しなくなるまで、現在のセグメントの位置が階層構造に従って移動しますが、Uコマンド・コードを指定したセグメントは現在の位置を維持します。 |
V |
Uコマンド・コードと基本的には同様な機能ですが、Vコマンド・コードを指定したセグメントの上位レベルのセグメントの位置も維持させます。 |
*W |
サブセット・ポインターが未設定の場合、現在の位置に設定します。 |
*Z |
サブセット・ポインターを0に初期化して再使用できるようにします。 |
― |
Nullコマンド・コードです。コマンド・コードをハイフン(-)で設定する場合、非修飾SSAとして処理します。プログラムの途中で、コマンド・コードを再設定して必要な作業を処理することもできます。 |
アスタリスク(*)が付いているコードはDEDBでのみ使用されます。 |
以下は、コマンド・コード別に使用可能なDL/I関数です。
GU/GHU | GN/GHN | GNP/GHNP | REPL | ISRT | DLET | |
---|---|---|---|---|---|---|
C |
○ |
○ |
○ |
− |
○ |
− |
D |
○ |
○ |
○ |
− |
○ |
− |
F |
○ |
○ |
○ |
− |
○ |
− |
L |
○ |
○ |
○ |
○ |
○ |
− |
M |
○ |
○ |
○ |
○ |
○ |
− |
N |
− |
− |
− |
○ |
− |
− |
P |
○ |
○ |
○ |
− |
○ |
− |
Q |
○ |
○ |
○ |
− |
○ |
− |
R |
○ |
− |
− |
− |
− |
− |
S |
○ |
○ |
○ |
○ |
○ |
− |
U |
○ |
○ |
○ |
− |
○ |
− |
V |
○ |
○ |
○ |
− |
○ |
− |
W |
○ |
○ |
○ |
○ |
○ |
− |
Z |
○ |
○ |
○ |
○ |
○ |
○ |
― |
○ |
○ |
○ |
○ |
○ |
○ |
5.4. 多重条件文
SSA内でブール演算子を各条件文の間に定義し、複数の条件文を結合して使用することができます。
関係 | 演算子 |
---|---|
AND(2つ以上の条件を満たす場合) |
「&」 または 「*」 |
OR (1つ以上の条件を満たす場合) |
「|」 または 「+」 |
以下は、COBOLプログラムで多重条件文を使用してSSAを実装した例です。
01 SEGMENT1-SSA. 05 FILLER PIC X(9) VALUE ‘SEGMENT1(‘. 05 FILLER PIC X(10) VALUE ‘SEG1CODE>=‘. 05 SEG1-SSA-LOW-CODE PIC X(3). 05 FILLER PIC X VALUE ‘&‘. 05 FILLER PIC X(10) VALUE ‘SEG1CODE<=‘. 05 SEG1-SSA-HIGH-CODE PIC X(3). 05 FILLER PIC X VALUE ‘)‘.