PERFORM subroutine-name |
M |
|||||||||
operand2 | (AD= |
O |
) | |||||||
A |
||||||||||
nX |
このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連ステートメント:CALL | CALL FILE | CALL LOOP | CALLNAT | DEFINE SUBROUTINE | ESCAPE | FETCH
関連機能グループ:「プログラムおよびルーチンの呼び出し」
PERFORM
ステートメントは、Natural サブルーチンを呼び出すために使用します。
呼び出し先サブルーチン内で他のサブルーチンを呼び出すための PERFORM
ステートメントを指定することもできます(ネストのレベル数は、要求されるメモリのサイズによって制限されます)。
サブルーチンは自分自身を呼び出すことができます(再帰サブルーチン)。 再帰的に呼び出される外部サブルーチン内にデータベース処理が含まれている場合、Natural はデータベース処理が論理的に分割されるようにします。
CALLNAT
ステートメントを参照してください。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | ステートメント参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand2 | C | S | A | G | A | U | N | P | I | F | B | D | T | L | C | G | O | 可 | 可 |
構文要素の説明:
subroutine-name |
呼び出すサブルーチン:
サブルーチン名(最大 32 文字)については、ユーザー定義変数と同じ命名規則が適用されます。 サブルーチン名は、該当のサブルーチンが定義されているモジュールの名前に依存しません(同じ名前にすることは可能ですが、同じ名前にする必要はありません)。 呼び出すサブルーチンは、 1 つのオブジェクト内で 50 個までの外部サブルーチンを参照できます。 サブルーチンで使用可能なデータ
|
|
---|---|---|
operand2 |
外部サブルーチンへのパラメータの引き渡し:
パラメータを渡す場合、 デフォルトでは、パラメータは"参照によって"渡されます。つまり、データはアドレスパラメータを介して転送され、パラメータ値自体は移動されません。 ただし、パラメータを"値によって"渡す、つまり実際のパラメータ値を渡すこともできます。 そのためには、これらのフィールドをサブルーチンの
注意: いずれのパラメータ引き渡し方法にも、次が適用されます。
注意: |
|
AD= |
属性の定義:
operand2 が変数の場合は、次のいずれかの方法でマークすることができます。 |
|
AD=O |
変更不可。セッションパラメータ 注意: |
|
AD=M |
変更可。セッションパラメータ これはデフォルト設定です。 |
|
AD=A | 入力のみ。セッションパラメータ AD=A を参照してください。
|
|
operand2 が定数の場合は、AD を明示的に指定することはできません。 定数には常に AD=O が適用されます。
|
||
nX |
省略されるパラメータの指定:
表記 省略されるパラメータは、サブルーチンの |
** Example 'PEREX1': PERFORM (as inline subroutine) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 ADDRESS-LINE (A20/2) 2 PHONE * 1 #ARRAY (A75/1:4) 1 REDEFINE #ARRAY 2 #ALINE (A25/1:4,1:3) 1 #X (N2) INIT <1> 1 #Y (N2) INIT <1> END-DEFINE * LIMIT 5 FIND EMPLOY-VIEW WITH CITY = 'BALTIMORE' MOVE NAME TO #ALINE (#X,#Y) MOVE ADDRESS-LINE(1) TO #ALINE (#X+1,#Y) MOVE ADDRESS-LINE(2) TO #ALINE (#X+2,#Y) MOVE PHONE TO #ALINE (#X+3,#Y) IF #Y = 3 RESET INITIAL #Y /* PERFORM PRINT /* ELSE ADD 1 TO #Y END-IF AT END OF DATA /* PERFORM PRINT /* END-ENDDATA END-FIND * DEFINE SUBROUTINE PRINT WRITE NOTITLE (AD=OI) #ARRAY(*) RESET #ARRAY(*) SKIP 1 END-SUBROUTINE * END
プログラム PEREX1
の出力:
JENSON LAWLER FORREST 2120 HASSELL 4588 CANDLEBERRY AVE 37 TENNYSON DRIVE #206 BALTIMORE BALTIMORE 998-5038 629-0403 881-3609 ALEXANDER NEEDHAM 409 SENECA DRIVE 12609 BUILDERS LANE BALTIMORE BALTIMORE 345-3690 641-9789
PERFORM
ステートメントを含むプログラム:
** Example 'PEREX2': PERFORM (as external subroutine) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 ADDRESS-LINE (A20/2) 2 PHONE * 1 #ALINE (A25/1:4,1:3) 1 #X (N2) INIT <1> 1 #Y (N2) INIT <1> END-DEFINE * LIMIT 5 * FIND EMPLOY-VIEW WITH CITY = 'BALTIMORE' MOVE NAME TO #ALINE (#X,#Y) MOVE ADDRESS-LINE(1) TO #ALINE (#X+1,#Y) MOVE ADDRESS-LINE(2) TO #ALINE (#X+2,#Y) MOVE PHONE TO #ALINE (#X+3,#Y) IF #Y = 3 RESET INITIAL #Y /* PERFORM PEREX2E #ALINE(*,*) /* ELSE ADD 1 TO #Y END-IF AT END OF DATA /* PERFORM PEREX2E #ALINE(*,*) /* END-ENDDATA END-FIND * END
プログラム PEREX2
から呼び出されるパラメータを含む外部サブルーチン PEREX3
:
** Example 'PEREX3': SUBROUTINE (external subroutine with parameters) ************************************************************************ DEFINE DATA PARAMETER 1 #ALINE (A25/1:4,1:3) END-DEFINE * DEFINE SUBROUTINE PEREX2E WRITE NOTITLE (AD=OI) #ALINE(*,*) RESET #ALINE(*,*) SKIP 1 END-SUBROUTINE * END
プログラム PEREX2
の出力:
JENSON LAWLER FORREST 2120 HASSELL 4588 CANDLEBERRY AVE 37 TENNYSON DRIVE #206 BALTIMORE BALTIMORE 998-5038 629-0403 881-3609 ALEXANDER NEEDHAM 409 SENECA DRIVE 12609 BUILDERS LANE BALTIMORE BALTIMORE 345-3690 641-9789