ZNSPACE
Synopsis
ZNSPACE:pc nspace ZN:pc nspace
引数
pc | オプション — 後置条件式 |
nspace | 既存のネームスペースの名前に評価する文字列式 |
説明
ZNSPACE nspace は、現在のネームスペースを nspace 値に変更します。nspace は、明示的でも暗黙的でもかまいません。
nspace が存在しない場合、システムは <NAMESPACE> エラーを生成します。ネームスペースへのアクセス特権を持っていない場合、システムは <PROTECT> エラーを生成した後に、データベース・パスを表示します。例えば、%Developer ロールには %SYS ネームスペースへのアクセス特権がありません。このロールを持っていて、このネームスペースにアクセスしようとすると、Caché は <PROTECT> *c:\intersystems\cache\mgr\ というエラーを返します (Windows システムの場合)。
ZNSPACE コマンド、%CD ユーティリティ (DO ^%CD) を使用するか、特殊変数 $NAMESPACE または $ZNSPACE を設定することで、現在のネームスペースを変更することができます。より拡張されたエラー・チェック機能を提供している、ZNSPACE、または %CD を使用することをお勧めします。
現在のネームスペースを一時的に変更する場合、処理を実行してから前のネームスペースに戻し、SET $NAMESPACE を使用します。$NAMESPACE は NEW $NAMESPACE を許可するため、サブルーチンの完了時または予期しないエラーの発生時に元のネームスペースに戻ります。詳細は、"$NAMESPACE" 特殊変数を参照してください。
ZNSPACE の使用の際、以下のメソッドでユーザの支援ができます。
-
現在のネームスペースの名前を返すには、以下のように $NAMESPACE 特殊変数または $ZNSPACE 特殊変数を返すか、または %SYSTEM.SYSOpens in a new tab クラスの NameSpace()Opens in a new tab メソッドを呼び出します。
WRITE $SYSTEM.SYS.NameSpace()
-
現在のプロセスで使用できるネームスペースをすべてリスト表示するには、以下のように %SYS.NamespaceOpens in a new tab クラスの ListAll()Opens in a new tab メソッドを呼び出します。
DO ##class(%SYS.Namespace).ListAll(.result) ZWRITE result
ListAll() が暗黙のネームスペースをリストする場合は、キャレット (^) 区切り文字を使用してシステム名を区切ります。
もしくは、%SYS.NamespaceOpens in a new tab クラスの ListOpens in a new tab クエリを以下のように呼び出します。
SET stmt=##class(%SQL.Statement).%New() SET status=stmt.%PrepareClassQuery("%SYS.Namespace","List") IF status'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(status) QUIT} SET rset= stmt.%Execute() DO rset.%Display()
これらのリストはどちらも、ユーザがアクセス特権を持っていないものも含め、すべてのネームスペースをリストします。
-
ネームスペースが定義されているかどうかをテストするには、以下のように %SYS.NamespaceOpens in a new tab クラスの Exists()Opens in a new tab メソッドを使用します。
WRITE ##class(%SYS.Namespace).Exists("USER"),! ; an existing namespace WRITE ##class(%SYS.Namespace).Exists("LOSER") ; a non-existent namespace
これらのメソッドは、"インターシステムズ・クラス・リファレンス" を参照してください。
UNIX® システムでは、システム全体の既定のネームスペースはシステム構成オプションとして設定されます。Windows システムでは、コマンド行スタートアップ・オプションを使用して設定されます。
ネームスペースの名前付け規約およびネームスペース名変換については、"Caché ObjectScript の使用法" の “構文規則” の章の "ネームスペース" を参照してください。ネームスペースの使用については、"Caché プログラミング入門ガイド" の "ネームスペースとデータベース" を参照してください。ネームスペースの作成および変更については、"Caché システム管理ガイド" の "ネームスペースの構成" を参照してください。
引数
pc
オプション — オプションの後置条件式。Caché は、後置条件式が True (0 以外の数値) の場合にこのコマンドを実行します。Caché は、後置条件式が False (0) の場合はコマンドを実行しません。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。
nspace
新しいネームスペースの名前に評価される有効な文字列式。nspace は、明示的でも暗黙的でもかまいません。
ネームスペース名は、大文字と小文字を区別しません。Caché は常に、明示的なネームスペース名をすべて大文字、暗黙的なネームスペース名をすべて小文字で表示します。
暗黙的なネームスペースは、システム名とディレクトリでネームスペースを指定します。これには、以下の 2 つの形式があります。
-
"^^dir" (ネームスペース・ディレクトリが現在のシステム上にある場合)
-
"^system^dir" (ネームスペース・ディレクトリがリモート・システム上にある場合)
dir にはディレクトリ・パスを指定します。詳細は、以下の例を参照してください。
Windows の例 :
ZNSPACE "^^c:\InterSystems\Cache\mgr\user\"
WRITE $NAMESPACE
Linux の例 :
ZNSPACE "^RemoteLinuxSystem^/usr/Cache/mgr/user/"
WRITE $NAMESPACE
例
以下の例は、NEW $NAMESPACE を使用して現在のネームスペースをスタックします。続いて、ZNSPACE を使用してネームスペースを変更します。QUITで、スタックされているネームスペースに戻ります。
WRITE "before: ",$NAMESPACE,!
DO Test
WRITE "after: ",$NAMESPACE,!
QUIT
Test
NEW $NAMESPACE
ZNSPACE "%SYS"
WRITE "testing: ",$NAMESPACE,!
QUIT
以下の例では、"accounting" と呼ばれるネームスペースが既に存在すると想定しています。そうでない場合は、<NAMESPACE> エラーが返されます。
プログラマ・プロンプトでの入力
USER>ZNSPACE "Accounting"
ACCOUNTING>
例に示されているように、ターミナル・プロンプトは既定で現在のネームスペース名を表示します。ネームスペース名は常に、大文字で表示されます。
以下の例はネームスペースの存在をテストし、次に ZNSPACE を使用して現在のネームスペースを設定し、TerminalPrompt()Opens in a new tab メソッドを使用してターミナル・プロンプトを、指定されたネームスペース、または USER に設定します。
WRITE !,"Current namespace is ",$NAMESPACE
SET ns="ACCOUNTING"
IF 1=##class(%SYS.Namespace).Exists(ns) {
WRITE !,"Changing namespace to: ",ns
ZNSPACE ns
DO ##class(%SYSTEM.Process).TerminalPrompt(2)
WRITE !,"and ",$NAMESPACE," will display at the prompt"
}
ELSE {
WRITE !,"Namespace ",ns," does not exist"
SET ns="USER"
WRITE !,"Changing namespace to: ",ns
ZNSPACE ns
DO ##class(%SYSTEM.Process).TerminalPrompt(2)
WRITE !,"and ",$NAMESPACE," will display at the prompt"
}
メモ
既定のディレクトリでのネームスペース
選択したネームスペースに、リモート・マシンの既定のディレクトリが存在する場合、ZNSPACE は、ユーザのプロセスの現在のディレクトリをそのネームスペースのディレクトリに変更しません。したがって、ユーザの現在のネームスペースは、選択したネームスペースとなりますが、現在のディレクトリは、ZNSPACE コマンドを発行する前のディレクトリのままです。
暗黙的なネームスペースのマッピング
ZNSPACE は、暗黙的なネームスペースからの追加の既定マッピングを作成します。これらのマッピングは、通常の (明示的な) ネームスペースに対するものと同じです。これらにより、プロセスは、CACHESYS データベースと CACHELIB データベース (cache\mgr\ ディレクトリと cache\mgr\cachelib ディレクトリ) に物理的に置かれている % ルーチンと % グローバルを見つけて実行できます。
$NAMESPACE 特殊変数または $ZNSPACE 特殊変数を設定すること、または暗黙的なネームスペースを使用して %CD ルーチンを実行することは、ZNSPACE コマンドを発行することと同じです。
% ルーチン・マッピング
プロセスが ZNSPACE コマンドを使用してネームスペースを切り替える場合、通常はシステム・ルーチンのパス・マッピングがリセットされます。これは、通常の (明示的な) ネームスペースと暗黙的なネームスペースの両方に当てはまります。唯一の例外は、プロセスが暗黙的なネームスペースから暗黙的なネームスペースに切り替えられるときで、その場合、既存のマッピングは保存されます。暗黙的なネームスペースに関する詳細は、"Caché グローバルの使用法" の "グローバル構造" を参照してください。
システム・ルーチンのこの再マッピングは、%SYSTEM.ProcessOpens in a new tab クラスの SysRoutinePath()Opens in a new tab メソッドを使用してオーバーライドできます。これは、既存のシステム・ルーチンのオーバーライドに使用できます。一般的に、これは、% ルーチンのデバッグ時に追加のマッピングを作成するために使用します。プロセスは、CACHESYS データベースに対する Write 権限を持っている必要があります。このメソッドを使用する際には、特に注意が必要です。
インターシステムズが提供したシステム・ルーチンのマッピングは、変更しないことを強くお勧めします。変更すると、インターシステムズが提供する現在または今後のライブラリ・ルーチンやメソッドが破壊される可能性があります。
% グローバル・マッピング
ユーザがはじめて ZNSPACE (またはそれに相当するコマンド) を使用して暗黙的なネームスペースに移動するとき、次のようにシステムでその暗黙的なネームスペースのマッピングが作成されます。Caché はまず、その暗黙的なネームスペース内の既存の % グローバルにマップします。そして、他のすべての % グローバルを CACHESYS にマップします。
暗黙的なネームスペースに対してこのマッピングが作成されると、マッピングは共有メモリに保存されます。つまり、それ以降、その暗黙的なネームスペースにユーザが移動するときは、この既存のマッピングが使用されることになります。
暗黙的なネームスペースのグローバル・マッピングを更新するには、この共有メモリ・ストレージをクリアする必要があります。システムの再起動は、共有メモリをクリアするための 1 つの方法です。
非推奨になった $ZUTIL(5) 関数は、暗黙的なネームスペースからの追加の既定マッピングを作成しません。したがって、プロセスは、CACHELIB データベースに物理的に置かれている % ルーチンと % グローバルを見つけて実行できません。このため、ZNSPACE または $NAMESPACE を強くお勧めします。既存の $ZUTIL(5) の使用は、可能になり次第廃止されます。
ネームスペースの表示を制御する
ターミナル・プロンプト
既定で、ターミナル・プロンプトは現在のネームスペース名を表示します。この既定は構成可能です。
管理ポータルに進み、システム, 構成, 開始設定 を選択します。[TerminalPrompt] の現在の設定を表示して編集します。Telnet ウィンドウのプロンプトで設定することもできます。
現在のプロセスに対するこの動作を設定するには、%SYSTEM.ProcessOpens in a new tab クラスの TerminalPrompt()Opens in a new tab メソッドを使用します。システム全体の既定の動作は、Config.StartupOpens in a new tab クラスの TerminalPromptOpens in a new tab プロパティで設定できます。
$NAME 関数と $QUERY 関数
$NAME と $QUERY 関数は、ネームスペース名を含むグローバル変数の拡張グローバル参照形式を返します。ユーザは、これらの関数がグローバル変数名の一部としてネームスペース名を返すか否かを制御することができます。%SYSTEM.ProcessOpens in a new tab クラスの RefInKind()Opens in a new tab メソッドを使用すると、現在のプロセスに対するこの拡張グローバル参照のスイッチを設定できます。システム全体の既定の動作は、Config.MiscellaneousOpens in a new tab クラスの RefInKindOpens in a new tab プロパティで設定できます。拡張グローバル参照の詳細は、"Caché グローバルの使用法" の "グローバル構造" を参照してください。
アプリケーション・コード内でのネームスペースの変更
オブジェクトと SQL コードは 1 つのネームスペースで動作していると見なすため、オブジェクト・インスタンスや SQL カーソルを開いたままネームスペースを変更すると、コードが正常に実行されない場合があります。通常は、さまざまなオブジェクト、SQL、および CSP サーバは、アプリケーション・コードを正しいネームスペースで実行するように自動的に確認するため、明示的にネームスペースを変更する必要はありません。
また、ネームスペースの変更は、他のコマンドに比べ高い処理能力を要するので、アプリケーション・コードはできるだけこれを回避します。
関連項目
-
JOB コマンド
-
$NAMESPACE 特殊変数
-
$ZNSPACE 特殊変数
-
"Caché システム管理ガイド" の "ネームスペースの構成"