ZSAVE (ObjectScript)
構文
ZSAVE:pc routine
ZS:pc routine
引数
引数 | 説明 |
---|---|
pc | オプション — 後置条件式 |
routine | オプション — ルーチンの新しい名前。単純なリテラルとして指定します。有効な識別子である必要があります。ルーチン名は、大文字と小文字を区別します。routine の値は括弧で囲みません。キャレット (^) 接頭語やファイル・タイプ接頭語は付きません。変数または式を使用して指定することはできません。 |
概要
ZSAVE コマンドは、現在のルーチンを保存します。ZLOAD を使用してルーチンをロードします。次に、ZSAVE を使用して、ZINSERT コマンドおよび ZREMOVE コマンドでルーチンに加えた変更を保存します。
ターミナルから入力したり、XECUTE コマンドまたは $XECUTE 関数で呼び出したりする場合は、ZSAVE コマンドのみ使用できます。このオペレーションはルーチンの実行に影響を与える可能性があるので、ルーチンの本体にコード化するべきではありません。ルーチン内で ZSAVE を指定すると、コンパイル・エラーが返されます。また、ルーチンから ZSAVE を実行しようとしても、エラーが生成されます。
ZSAVE では、編集ポインタは移動しません。
ZLOAD を使用してルーチンを現在のルーチンとしてロードした場合、以下のように処理されます。
-
ZINSERT や ZREMOVE を使用して現在のルーチンを変更した後、ZSAVE でルーチンを保存した場合:^rINDEX("MyRoutine","INT") グローバルと ^rINDEX("MyRoutine","OBJ") グローバルは最新のタイムスタンプと文字数に更新され、^ROUTINE("MyRoutine",0) グローバルは更新されます。
-
現在のルーチンを変更せずに ZSAVE でルーチンを保存した場合:^rINDEX("MyRoutine","OBJ") グローバルは更新されます。^rINDEX("MyRoutine","INT") グローバルまたは ^ROUTINE("MyRoutine",0) グローバルは変更されません。
詳細は、"INT コードと ^ROUTINE グローバル" を参照してください。
ZSAVE には、以下の 2 つの形式があります。
引数なしの ZSAVE
引数なしの ZSAVE は、現在のルーチンを現在の名前で保存します。これは、ZLOAD で指定した名前か、以前に ZSAVE を使用して保存した名前です。ZSAVE は、ルーチンを現在のネームスペースに保存します。
以下の例では、USER ネームスペースからルーチンをロードし、ルーチンを変更してから、別のネームスペースに変更して ZSAVE を実行します。これらの操作の結果、USER ネームスペースと TESTNAMESPACE ネームスペースの両方に MyRoutine という名前のルーチンが存在するようになります。TESTNAMESPACE の MyRoutine には、挿入されたコード行が含まれます。USER の MyRoutine には、挿入されたコード行は含まれません。
USER>ZLOAD MyRoutine
USER>ZPRINT +1:+4
WRITE "this is line 1",!
WRITE "this is line 2",!
WRITE "this is line 3",!
WRITE "this is line 4",!
USER>ZINSERT " WRITE 123,!":+3
USER>ZPRINT +1:+5
WRITE "this is line 1",!
WRITE "this is line 2",!
WRITE "this is line 3",!
WRITE 123,!
WRITE "this is line 4",!
USER>ZNSPACE "TESTNAMESPACE"
TESTNAMESPACE>ZPRINT +1:+5
WRITE "this is line 1",!
WRITE "this is line 2",!
WRITE "this is line 3",!
WRITE 123,!
WRITE "this is line 4",!
TESTNAMESPACE>ZSAVE
現在のルーチンにまだ名前がない場合、引数なしの ZSAVE は <COMMAND> エラーを生成します。
引数なしの ZSAVE コマンドでは後置条件式を指定することができます。
引数付きの ZSAVE
ZSAVE routine は、現在のルーチンを、指定された routine 名でディスクに保存します。また、指定された routine を現在のルーチンにします。例えば、MyRoutine という名前のルーチンをロードし、変更してから ZSAVE MyNewRoutine を使用して保存した場合、変更が含まれる MyNewRoutine が現在のルーチンになります。MyRoutine という名前のルーチンにはこれらの変更は含まれず、このルーチンは現在のルーチンとしてロードされていません。
ZSAVE routine は、現在のルーチンを現在のネームスペースに保存します。例えば、USER ネームスペースから MyRoutine という名前のルーチンをロードし、別のネームスペースに変更して ZSAVE MyNewRoutine を実行した場合、MyNewRoutine は、USER ネームスペースではなく変更先のネームスペースに保存されます。
XECUTE コマンドを使用して ZSAVE routine を呼び出す場合、システムは、Load フレームを作成して現在のルーチンを保持します。XECUTE コマンドが終了すると、InterSystems IRIS は、この Load フレームを使用して、現在のルーチンとして、XECUTE の前にルーチン名をリストアします。詳細は、以下の例を参照してください。
WRITE "Current routine name",!
WRITE "initial name: ",$ZNAME,!
SET x = "WRITE $ZNAME"
SET y = "ZSAVE mytest"
SET z = "WRITE "" changed to "",$ZNAME,!"
XECUTE x,y,z
WRITE "restored name: ",$ZNAME,!
引数なしの ZLOAD でロードしたルーチンに名前を付けるには、ZSAVE routine を使用します。
ZINSERT コマンドで作成した名前のないルーチンに名前を付けるには、ZSAVE routine を使用します。
引数
pc
オプションの後置条件式。InterSystems IRIS は、後置条件式が True (0 以外の数値に評価される) の場合にコマンドを実行します。InterSystems IRIS は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。 For further details, refer to Command Postconditional Expressions.
routine
ルーチンを保存する名前。routine は有効なルーチン名である必要があります。$ZNAME("string",1) 関数を使用すると、string が有効なルーチン名かどうかを判定できます。$ZNAME 特殊変数で、現在ロードされているルーチンの名前を判別できます。
通常、routine はルーチンの新しい名前ですが、現在のルーチン名にすることもできます。その名前のルーチンが既に現在のネームスペースに存在する場合、InterSystems IRIS はそれを上書きします。上書きするときに、Caché からの確認はないことに注意してください。ルーチン名の最初の 255 文字以内は一意である必要があります。220 文字を超える長さのルーチン名は避けてください。
routine を省略すると、システムは現在の名前でルーチンを保存します。現在の名前が存在しない場合、ZSAVE は <COMMAND> エラーを生成します。
ZSAVE およびルーチンのリコンパイル
ソース・コードを変更するコマンドを発行した場合、ZSAVE はルーチンをリコンパイルして保存します。ルーチンのソース・コードが無効な場合、ZSAVE は失敗して <NO SOURCE> エラーが発生し、既存のオブジェクト・コードを置換しません。例えば、次のコマンドは %SS オブジェクト・コード・ルーチンをロードして、(存在しない) ソース・コードから行を削除しようとし、その後 ^test グローバルに保存しようとします。この処理は失敗して、<NO SOURCE> エラーが発生します。
ZLOAD %SS ZREMOVE +3 ZSAVE ^test
ソース・コードを変更するコマンドを発行しない場合、ZSAVE は指定された routine にオブジェクト・コードを保存します(明らかにリコンパイルは発生しません)。例えば、次のコマンドは %SS オブジェクト・コード・ルーチンをロードして、^test グローバルに保存します。この処理は成功します。
ZLOAD %SS ZSAVE ^test
%Routine での ZSAVE
リモート・データセットに対する %routine に ZSAVE の実行を試みると、そのデータセットがプロセスの現在のデータセットであっても、<PROTECT> エラーが返されます。システム・ユーティリティのような変更不可のルーチンの名前には、その先頭にパーセント記号が使用されています。
並行 ZSAVE オペレーション
ネットワーク環境で ZSAVE を使用しているときは、2 つの異なるジョブがそれぞれのルーチンに同じ名前を割り当てて同時に保存する可能性があります。このオペレーションでは、一方のルーチンが他方を上書きし、予測できない結果を生じる可能性があります。こうした可能性がある場合は、ZSAVE オペレーションの前にルーチンに対して通知ロックを取得します。例えば、LOCK ^ROUTINE("name") を使用します。詳細は、"LOCK" コマンドを参照してください。ECP 経由でジョブを実行しているとき、ローカル・バッファの保護が他のクライアントには認識されないため、保存されたソースはこうした同時保存による障害を受けやすい状態になります。
例
以下のターミナル・セッションの例は、ZSAVE コマンドを実行して、現在ロードされているルーチンを保存します。
USER>DO ^myroutine
this is line 8
this is line 9
USER>ZLOAD myroutine
USER>PRINT +8
WRITE "this is line 8",!
USER>ZREMOVE +8
USER>PRINT +8
WRITE "this is line 9",!
USER>ZSAVE myroutine
USER>DO ^myroutine
this is line 9
USER>