Skip to main content

プロセス・プライベート・グローバル

ObjectScript のプロセス・プライベート・グローバルは、これを作成したプロセスによってのみアクセス可能な変数です。プロセスの終了時、プロセス・プライベート・グローバルはすべて削除されます。

プロセス・プライベート・グローバルは、IRISTEMP データベースに書き込まれます。グローバル変数とは対照的に、ローカル変数またはプロセス・プライベート・グローバル変数の SET または KILL は、ジャーナル化されたトランザクション・イベントとして扱われません。このようなイベントでは、トランザクションをロールバックしても、これらの処理には何の影響もありません。

概要

プロセス・プライベート・グローバルには、次のような特徴があります。

  • プロセス固有 : プロセス・プライベート・グローバルは、作成元のプロセスからのみアクセス可能で、そのプロセスが完了すると存在しなくなります。これは、ローカル変数と同様です。

  • 常にパブリック : プロセス・プライベート・グローバルは常にパブリック変数です。これは、グローバル変数と同様です。

  • ネームスペース非依存 : プロセス・プライベート・グローバルは、すべてのネームスペースからアクセスできます。

  • 引数なしの KILLNEWWRITE、または ZWRITE の影響を受けない : プロセス・プライベート・グローバルを KILLWRITE、または ZWRITE の引数として指定できます。これは、グローバル変数と同様です。

命名規則

プロセス・プライベート・グローバル名は、次のいずれかの形式となります。

^||name 
^|"^"|name 
^["^"]name 
^["^",""]name

これらの 4 つの接頭語は同等で、4 つはいずれも同じプロセス・プライベート・グローバルを参照します。最初の形式 (^||name) が最も一般的で、新しいコードに推奨されるものです。2 番目 ~ 4 番目の形式は、グローバルを定義する既存のコードとの互換性のために提供されています。

接頭語を除き、プロセス・プライベート・グローバルは、"識別子のルールとガイドライン" で説明するように、通常のグローバルと同じ名前付け規約を使用します。概要は以下のようになります。

  • 最初の文字 (2 番目の垂直バーの後) は、文字、もしくはパーセント記号 (%) のいずれかにする必要があります。

    % で始まるプロセス・プライベート変数名は、"パーセント変数" と呼ばれ、その有効範囲の規則は異なります。コードでは、これらの変数の名前は、%Z または %z で始めます。他の名前はシステムで使用するために予約されています。例えば、^||%Zmyvar のようになります。

  • ローカル変数とは異なり、グローバル名 (プロセス・プライベート・グローバルを含む) には、Unicode 文字 (ASCII 255 よりもコード値が大きい文字) を使用できません。プロセス・プライベート・グローバル名に Unicode 文字を使用すると <WIDE CHAR> エラーが発生します。

  • このプロセス・プライベート・グローバル名を含め、すべての変数名では、大文字と小文字が区別されます。

  • プロセス・プライベート・グローバル名は、プロセス内で一意である必要があります。

  • ローカル変数とは異なり、プロセス・プライベート・グローバル名は、接頭語を除き最大 31 文字です。31 文字より長い名前を指定することもできますが、最初の 31 文字のみが使用されます。このため、プロセス・プライベート・グローバル名は最初の 31 文字内で一意である必要があります。

  • その他の変数と同様に、プロセス・プライベート・グローバルには添え字を使用できます。

プロセス・プライベート・グローバルのリスト

^$GLOBAL()^$||GLOBAL() 構文形式を使用して、現在のプロセスに属するプロセス・プライベート・グローバルに関する情報を返すことができます。

^GETPPGINFO ルーチンを使用して、現在のすべてのプロセス・プライベート・グローバルの名前およびそれらのスペース割り当てをブロック単位で表示できます。^GETPPGINFO はプロセス・プライベート・グローバルの添え字も値もリストしません。プロセス ID (pid) を指定することで、特定プロセスのプロセス・プライベート・グローバルを表示できます。また、ワイルドカード文字列 (*) を指定することで、すべてのプロセスのプロセス・プライベート・グローバルを表示できます。^GETPPGINFO を呼び出すには %SYS ネームスペースで作業する必要があります。

以下の例では、^GETPPGINFO を使用して、現在のすべてのプロセスのプロセス・プライベート・グローバルをリストします。

  SET ^||flintstones(1)="Fred"
  SET ^||flintstones(2)="Wilma"
  NEW $NAMESPACE
  SET $NAMESPACE="%SYS"
  DO ^GETPPGINFO("*")

^GETPPGINFO ルーチンは、以下のように引数を取ります。

 do ^GETPPGINFO("pdf","options","outfile")

これらの引数は以下のとおりです。

  • pdf はプロセス ID または * ワイルドカードにすることができます。

  • options は次の文字列のあらゆる組み合わせにすることができます。

    • b (バイト数で値を返す)

    • Mnn (nn 個以上のブロックを使用するプロセス・プライベート・グローバルがあるプロセスのみをリストする)

      プロセス・プライベート・グローバルがないプロセスをリストに含めるには M0 を使用します。

      プロセス・プライベート・グローバルがないプロセスはリストから除外し、グローバル・ディレクトリ・ブロックのみがあるプロセスを含めるには M1 を使用します。(これが既定です。)

      プロセス・プライベート・グローバルがないプロセスをリストから除外し、グローバル・ディレクトリ・ブロックのみがあるプロセスも除外するには M2 を使用します。

    • S (outfile と共に使用して画面表示を抑制)

    • T (プロセスの合計数のみを表示)

  • outfile は、^GETPPGINFO 出力を受け取る CSV (コンマ区切り値) 形式ファイルのファイル・パスです。

次の例では、プロセス・プライベート・グローバルを ppgout という名前の出力ファイルに書き込みます。S オプションで画面表示を抑制し、出力を 500 ブロック以上使用するプロセス・プライベート・グローバルがあるプロセスのみを M500 オプションで表示します。

  NEW $NAMESPACE
  SET $NAMESPACE="%SYS"
  DO ^GETPPGINFO("*","SM500","/home/myspace/ppgout") 

%SYS.ProcessQueryOpens in a new tab テーブルに、プロセス・プライベート・グローバルに関する情報を照会することもできます。以下に例を示します。

SELECT PID, Routine, PrivateGlobalBlockCount 
       FROM %SYS.ProcessQuery 
       WHERE PrivateGlobalBlockCount>0 
       ORDER BY PrivateGlobalBlockCount DESC

関連項目

FeedbackOpens in a new tab