Rational Developer for System z
Enterprise PL/I for z/OS, Version 4.1, 言語解説書

FETCH ステートメント

FETCH ステートメントは、指定されたプロシージャーが主記憶域に存在しているかを調べます。 主記憶域内に存在していないプロシージャーは、ディスクからロードされます。

構文図を読む構文図をスキップする>>-FETCH-------------------------------------------------------->
 
   .-,----------------------------------------------------------.
   V                                                            |
>----entry-constant-+-----------------+-+---------------------+-+-->
                    '-SET-(-ptr-ref-)-' '-TITLE-(-char-expr-)-'
 
>--;-----------------------------------------------------------><
 
entry-constant
取り出されるプロシージャーの名前で、オペレーティング・システムに 知られているものを指定します。 取り出し可能なプロシージャーに関連する考慮事項の詳細については、 「プログラミング・ガイド」を参照してください。

entry-constant (入り口定数) は、対応する CALL ステートメント、 CALL オプション、または関数参照内で使用する入り口定数と同じでなければなりません。

SET
ロードしたモジュールのエントリー・ポイントのアドレスにセットされるポインター参照 (ptr-ref) を指定します。 このオプションは、テーブル (実行できないロード・モジュール) を ロードするために使用することができます。 また、非 PL/I プロシージャーへ渡さなければならないアドレスを持つ、 取り出された項目に対しても使用することができます。

ロード・モジュールを後に RELEASE ステートメントによって解放して、さらにそのロード・モジュールに (ポインターを使用して) アクセスすると、予期しない結果が生じます。

TITLE
TITLE の場合、char-expr は任意の文字式、または文字式に変換可能な任意の式です。 TITLE が指定されると、指定されたロード・モジュール名が探索され、ロードされます。 指定されていない場合には、使用されるロード・モジュール名は、(表示されて いれば) 変数の EXTERNAL 属性で指定された環境名、または入り口定数名自体になります。

以下に例を示します。

  dcl A entry;
  dcl B entry ext('C');
  dcl T char(20) varying;
  T = 'Y';
 
  fetch A title('X');           /* X is loaded */
  fetch A;                      /* A is loaded */
  fetch B title('Y');           /* Y is loaded */
  fetch B;                      /* C is loaded */
  fetch B title(T);             /* Y is loaded */

タイトル・ストリングの詳細については、「プログラミング・ガイド」を参照してください。

RELEASE ステートメント

RELEASE ステートメントは、指定した entry constant (入り口定数) が識別する プロシージャーによって占められた主記憶域を解放します。

構文図を読む構文図をスキップする              .-,--------------.
              V                |
>>-RELEASE--+---entry-constant-+-+--;--------------------------><
            '-*------------------'
 
入り口定数 (entry constant)
対応する CALL ステートメント、CALL オプション、関数参照、 および FETCH ステートメントに使用する入り口定数と同じでなければなりません。 RELEASE * は、それ以前にフェッチされた すべての PL/I モジュールを解放します。 RELEASE ステートメントは、フェッチされた モジュール内部から実行してはなりません。

モジュールが同じ外部プロシージャー内で以前にフェッチされなかった場合、または既に解放されている場合、入り口定数は NULL ポインターになります。 解放が実行されない場合、メッセージは出されず、RELEASE ステートメントに続くステートメントの実行が続行されます。

以下の例を考えてください。ProgAProgB は、 ディスクに常駐しているプロシージャーの入り口名です。

         Prog:  procedure;
 
 1          fetch ProgA;
 2          call ProgA;
 3          release ProgA;
 
 4          call ProgB;
            go to Fin;
 
            fetch ProgB;
         Fin:  end Prog;

 1 
ProgA は、最初の FETCH ステートメントによって主記憶域にロードされます。
 2 
ProgA は、最初の CALL ステートメントに達したときに実行されます。
 3 
ProgA のストレージは、RELEASE ステートメントが実行されると解放されます。
 4 
ProgB は、このプロシージャーを参照する FETCH ステートメントが 実行されなくても、2 番目の CALL ステートメントに達すると、ロードされ、 実行されます。

FETCH ProgA ステートメントが省略された場合でも同じ結果になります。 RELEASE ステートメント内に ProgA を指定すると、 それを呼び出したときと同様に、CALL ProgA ステートメントが プロシージャーをロードします。

取り出されたプロシージャーは、 呼び出しプロシージャーとは別々にコンパイルされ、リンクされます。 FETCH ステートメント、RELEASE ステートメント、CALL ステートメント、 CALL オプション、および関数参照で指定される入り口定数は、ディスク上で 認識される名前でなければなりません。 これは「プログラミング・ガイド」に説明があります。

注:
モジュールが解放される前に、モジュールは獲得したシステム・リソースをすべて解放する必要があります。 これには以下のアクションが含まれます (これらに限られません)。

Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)