Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

ZSAVE (ObjectScript)

現在のルーチンを保存します。

Synopsis

ZSAVE:pc routine
ZS:pc routine

引数

引数 説明
pc オプション — 後置条件式
routine オプション — ルーチンの新しい名前。単純なリテラルとして指定します。有効な識別子である必要があります。ルーチン名は、大文字と小文字を区別します。routine の値は括弧で囲みません。キャレット (^) 接頭語やファイル・タイプ接頭語は付きません。変数または式を使用して指定することはできません。

概要

ZSAVE コマンドは、現在のルーチンを保存します。ZLOAD を使用してルーチンをロードします。次に、ZSAVE を使用して、ZINSERT コマンドおよび ZREMOVE コマンドでルーチンに加えた変更を保存します。

ターミナルから入力したり、XECUTE コマンドまたは $XECUTE 関数で呼び出したりする場合は、ZSAVE コマンドのみ使用できます。このオペレーションはルーチンの実行に影響を与える可能性があるので、ルーチンの本体にコード化するべきではありません。ルーチン内で ZSAVE を指定すると、コンパイル・エラーが返されます。また、ルーチンから ZSAVE を実行しようとしても、エラーが生成されます。

ZSAVE では、編集ポインタは移動しません。

ZLOAD を使用してルーチンを現在のルーチンとしてロードした場合、以下のように処理されます。

  • ZINSERTZREMOVE を使用して現在のルーチンを変更した後、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 に評価される) の場合はコマンドを実行しません。詳細は、"ObjectScript の使用法" の "コマンド後置条件式" を参照してください。

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>

関連項目

FeedbackOpens in a new tab