Skip to main content

グローバルの操作

ここでは、多次元ストレージ (グローバル) を使用して実行できるさまざまな処理について説明します。

"一時グローバルと IRISTEMP データベース" も参照してください。

Note:

アプリケーション内でダイレクト・グローバル・アクセスを使用するとき、名前付け規約を作成し、アプリケーションの異なる部分同士でお互いの名前が“衝突”しないように規約に従ってください。これは、クラス、メソッド、他の変数に名前付け規約を作成するときと同様です。また、InterSystems IRIS® データ・プラットフォームが使用する特定のグローバル名を避けてください。それらのリストについては、"回避する必要があるグローバル変数名" を参照してください。

グローバルへのデータ格納

グローバル・ノードへのデータの格納は単純で、グローバルを他の変数のように処理するだけです。違いは、グローバルに対する処理が自動的にデータベースに書き込まれる点です。

グローバルの生成

新しいグローバルを生成するための設定作業は一切必要ありません。グローバルにデータを設定するだけで、自動的に新しいグローバル構造が生成されます。 グローバル (またはグローバル添え字) を生成し、1 回の演算でそこにデータを置くことができます。グローバル (または添え字) を生成し、NULL 文字列を設定すれば空のグローバルのままとなります。ObjectScript では、これらの処理は SET コマンドを使用して実行します。

以下の例は、Color という名のグローバルが存在しなければそれを定義し、値 “Red” と関連付けます。Color という名前のグローバルが既に存在する場合は、新規の情報を格納できるようにそのグローバルを修正します。

ObjectScript では以下のようになります。

 SET ^Color = "Red"

グローバル・ノードに格納するデータ

グローバル添え字ノードに値を格納するには、他の変数と同様に、グローバル・ノードの値を設定します。指定したノードが存在していない場合は、そのノードを生成します。既に存在している場合、既存の値を新しい値に置き換えます。

グローバル・ノードには任意のデータを格納できます。ただし、例外として、最大文字列長制限を超える極端に長い文字列を含めることはできません。"一般的なシステム制限"を参照してください。

グローバル・ノードの値の設定は、アトミック処理です。これは、正常に実行できることが保証されており、整合性を確保するためのロックを使用する必要もありません。

   SET ^TEST = 2
   SET ^TEST("Color")="Red"
   SET ^TEST(1,1)=100        /* The 2nd-level subscript (1,1) is set
                                to the value 100. No value is stored at
                                the 1st-level subscript (^TEST(1)). */   
   SET ^TEST(^TEST)=10       /* The value of global variable ^TEST 
                                is the name of the subscript. */
   SET ^TEST(a,b)=50         /* The values of local variables a and b
                                are the names of the subscripts. */
   SET ^TEST(a+10)=50       

間接演算を使用して、実行時にグローバル参照を構築することもできます。

グローバル・ノードの削除

グローバル・ノード、サブノードのグループ、またはグローバル全体をデータベースから削除するには、ObjectScript の KILL コマンドまたは ZKILL コマンドを使用します。

KILL コマンドは、下位ノードを含むすべてのノード (データおよび配列内にあるそのエントリ) を特定のグローバル参照で削除します。つまり、指定した添え字で開始するすべてのノードが削除されます。

例えば、以下の ObjectScript 文を考えます。

  KILL ^TEST

これは ^TEST グローバル全体を削除します。このグローバルを引き続き参照すると <UNDEFINED> エラーを返します。

以下にもう 1 つ ObjectScript 文があります。

   KILL ^TEST(100)

これは、^TEST グローバルのノード 100 のコンテンツを削除します。^TEST(100,1)、^TEST(100,2)、^TEST(100,1,2,3) などの下位ノードがある場合、同様に削除されます。

ObjectScript の ZKILL コマンドは、指定されたグローバルやグローバルの添え字ノードを削除します。下位ノードは削除しません。

Note:

大規模なグローバルを削除した後、そのグローバルで使用していた領域が完全には解放されていないことがあります。これは、そのブロックがガベージ・コレクタ・デーモンによってバックグラウンドで解放としてマークされているからです。したがって、大規模なグローバルを削除した直後に SYS.DatabaseOpens in a new tab クラスの ReturnUnusedSpace メソッドを呼び出すと、そのグローバルで使用していたブロックがまだ解放されていないので、想定よりも少ない領域の値が返される場合があります。

グローバル変数には New コマンドを使用できません。

グローバル・ノードの存在有無のテスト

特定のグローバル (またはその下位ノード) がデータを含むかどうかをテストするには、$DATA 関数を使用します。

$DATA は、指定したグローバル参照が存在するか否かを示した値を返します。以下がその値の例です。

状態値 意味
0 グローバル変数が定義されていません。
1 グローバル変数が存在し、データを含みますが、下位ノードはありません。NULL 文字列 ("") もデータと見なされます。
10 グローバル変数に下位ノードがありますが (下位ノードへの下方ポインタを含みます)、そのノード自身はデータを含みません。このような変数への直接参照は、<UNDEFINED> エラーになります。例えば、$DATA(^y) が 10 を返す場合、SET x=^y は <UNDEFINED> エラーを生成します。
11 データと下位ノードを含むグローバル変数です (下位ノードへの下方ポインタも含みます)。

グローバル・ノード値の検索

特定のグローバル・ノード内に格納された値を取得するには、グローバル参照を式として使用します。

   SET color = ^TEST("Color")    ; assign to a local variable
   WRITE ^TEST("Color")          ; use as a command argument
   SET x=$LENGTH(^TEST("Color")) ; use as a function parameter

$GET 関数

$GET 関数を使用してグローバル・ノードの値を取得することもできます。

   SET mydata = $GET(^TEST("Color"))

指定ノードの値を取得する (存在する場合) か、ノードに値がない場合は NULL 文字列 ("") を返します。$GET のオプションの 2 番目の引数を使用して、ノードに値がない場合に指定された既定値を返すこともできます。

WRITE コマンド、ZWRITE コマンド、ZZDUMP コマンド

ObjectScript のさまざまな表示コマンドを使用して、グローバルやグローバル・サブノードのコンテンツを表示できます。WRITE コマンドは、指定されたグローバルやサブノードの値を文字列として返します。ZWRITE コマンドは、グローバル変数名とその値、および下位ノードとその値を返します。ZZDUMP コマンドは、指定されたグローバルやサブノードの値を 16 進数ダンプ形式で返します。

グローバル内のデータ走査

グローバル内に格納されているデータの走査 (反復) には多くの方法があります。

$ORDER (Next / Previous) 関数

ObjectScript の $ORDER 関数では、グローバル内の各ノードに順にアクセスできます。

引数として 1 つの添え字 (または一連の添え字) が指定されると、$ORDER 関数は指定されたレベルで次の添え字の値を返します。これについては、以下の例でうまく説明できます。以下のように、^TEST という名前のグローバルで一連のノードを定義したとします。

 Set ^TEST(1) = ""
 Set ^TEST(1,1) = ""
 Set ^TEST(1,2) = ""
 Set ^TEST(2) = ""
 Set ^TEST(2,1) = ""
 Set ^TEST(2,2) = ""
 Set ^TEST(5,1,2) = ""

最初のファースト・レベル添え字を検索するには、以下を使用します。

 SET key = $ORDER(^TEST(""))

これは、NULL 文字列 () に続けて最初の最上位の添え字を返します(NULL 文字列は、最初のエントリのの添え字値を表すために使用します。また、以降の添え字値がないことを示す返り値としても使用されます)。この例では、key が値 1 を含みます。

1、または $ORDER 式の key を使用して、次の最上位の添え字を検索できます。

 SET key = $ORDER(^TEST(key))

key に初期値 1 がある場合、この文で 2 に設定されます (^TEST(2) が次のファースト・レベル添え字であるため)。この文を再度実行すると、key は次のファースト・レベル添え字の 5 に設定されます。^TEST(5) に直接格納されているデータはありませんが、5 を返すという点に注意してください。この文を再実行しても、これ以上ファースト・レベル添え字が存在しないため、key は NULL 文字列 ("") に設定されます。

追加の添え字を $ORDER 関数で使用することで、異なる添え字レベルを繰り返すことができます。例えば、以下の文は、上記のデータを使用した例です。

 SET key = $ORDER(^TEST(1,""))

ここでは、^TEST(1,1) が次のセカンド・レベルの添え字であるため、key が 1 に設定されます。この文を再度実行すると、key は次のセカンド・レベル添え字の 2 に設定されます。この文をもう一度実行しても、ノード ^TEST(1) にはこれ以上セカンド・レベル添え字が存在しないため、key"" に設定されます。

$ORDER によるループ

以下の ObjectScript コードは単純グローバルを定義し、そのファースト・レベル添え字をすべてループします。

 // clear ^TEST in case it has data
 Kill ^TEST

 // fill in ^TEST with sample data
 For i = 1:1:100 {
     // Set each node to a random person's name
     Set ^TEST(i) = ##class(%PopulateUtils).Name()
 }

 // loop over every node
 // Find first node
 Set key = $Order(^TEST(""))

 While (key '= "") {
     // Write out contents
     Write "#", key, " ", ^TEST(key),!

     // Find next node
     Set key = $Order(^TEST(key))
 }

追加の $ORDER 引数

ObjectScript の $ORDER 関数は、オプションとして 2 番目の引数や 3 番目の引数を持ちます。2 番目の引数は方向フラグで、グローバルを検索する方向を示します。既定値の 1 は前方検索を指定し、-1 は後方検索を指定します。

3 番目の引数はローカル変数名を指定します。$ORDER で見つかったノードがデータを含む場合、そのデータがこのローカル変数に書き込まれます。グローバルをループし、添え字値とノード値を取得する場合は、このアプローチが効率的で、コーディングの手順が最も少なくて済みます。

グローバルの反復

指定されたグローバルが連続値の添え字を使用する構成であることがわかっている場合は、単純な For ループでその値を使用して繰り返し処理が可能です。例えば、以下のように指定します。

 For i = 1:1:100 {
     Write ^TEST(i),!
 }

通常は、上記で説明した $ORDER 関数を使用することをお勧めします。その方が効率も良く、削除されたノードのようなデータ間の欠落部分を心配する必要もありません。

$QUERY 関数

サブノード間を移動して、グローバルにある各ノードと各サブノードにアクセスする場合は、ObjectScript の $QUERY 関数を使用します (または、入れ子にした $ORDER ループでも可能です)。

$QUERY 関数はグローバル参照をとり、グローバルにある次のノードのグローバル参照を含む文字列 (後にノードが続かない場合は "") を返します。$QUERY で返された値を使用するには、ObjectScript の間接演算子 (@) を使用する必要があります。

例えば、以下のグローバルを定義するとします。

 Set ^TEST(1) = ""
 Set ^TEST(1,1) = ""
 Set ^TEST(1,2) = ""
 Set ^TEST(2) = ""
 Set ^TEST(2,1) = ""
 Set ^TEST(2,2) = ""
 Set ^TEST(5,1,2) = ""

以下は $QUERY の呼び出しです。

 SET node = $QUERY(^TEST(""))

これは、node を文字列 “^TEST(1)” に設定します。^TEST(1) は、グローバルの最初のノードのアドレスです。その後、グローバルの次のノードを取得するには、$QUERY を再度呼び出し、node で間接演算子を使用します。

 SET node = $QUERY(@node)

この時点で、node は文字列 “^TEST(1,1)” を含みます。

以下の例では、グローバル・ノードを設定した後、$QUERY を使用して検索し、各ノードのアドレスを記述します。

 Kill ^TEST // make sure ^TEST is empty

 // place some data into ^TEST
 Set ^TEST(1) = ""
 Set ^TEST(1,1) = ""
 Set ^TEST(1,2) = ""
 Set ^TEST(2) = ""
 Set ^TEST(2,1) = ""
 Set ^TEST(2,2) = ""
 Set ^TEST(5,1,2) = ""

 // now walk over ^TEST
 // find first node
 Set node = $Query(^TEST(""))
 While (node '= "") {
     Write node,!
     // get next node
     Set node = $Query(@node)
 }

グローバル内でのデータのコピー

グローバルのコンテンツ (全体または一部) を別のグローバル (またはローカル配列) にコピーするには、ObjectScript の MERGE コマンドを使用します。

以下の例は、^OldData グローバルのコンテンツ全体を ^NewData グローバルにコピーする MERGE コマンドの使用法を示しています。

 Merge ^NewData = ^OldData

MERGE コマンドのソース引数に添え字がある場合、そのノード内のすべてのデータと派生ノードがコピーされます。方向引数に添え字がある場合、宛先のアドレスを最上位ノードとして使用し、データをコピーします。以下はコードの例です。

 Merge ^NewData(1,2) = ^OldData(5,6,7)

これは、^OldData(5,6,7) と、その下にあるすべてのデータを ^NewData(1,2) にコピーします。

グローバルでの共有カウンタ保持

大規模なトランザクション処理では、一意の識別子を作成することで並行処理上の大きなボトルネックが発生することがあります。例えば新規送り状に、それぞれ一意の識別子番号を付ける注文処理作業を考えてみます。従来の方法としては、カウンタ・テーブルのようなものを保持します。新規送り状作成の各過程では、カウンタのロックを取得し、その値をインクリメントし、ロックの解放を行います。その結果、この単独のレコード上で、リソースが頻繁に競合することになります。

この問題を処理するために、ObjectScript の $INCREMENT 関数があります。$INCREMENT は、自動的にグローバル・ノードの値をインクリメントします (ノードに値がない場合は 1 に設定されます)。$INCREMENT の基本的な性質としてロックは不要です。他のプロセスからの干渉なしで、インクリメントされた値を返す機能が保証されているからです。

以下のようにして $INCREMENT を使用できます。まず、カウンタを保持するグローバル・ノードを決定します。次に、新規のカウンタ値が必要になるたびに $INCREMENT を実行します。

 SET counter = $INCREMENT(^MyCounter)

永続クラス (SQL を介して作成されたもの以外) の場合、既定のストレージ構造は $INCREMENT を使用して一意のオブジェクト (行) 識別子の値を割り当てます。SQL を介して作成された永続クラスの場合は、既定のストレージ構造は代わりに $SEQUENCE を使用します。

グローバルでのデータのソート

グローバルに格納されたデータは、添え字値に従って自動的にソートされます。例えば、以下の ObjectScript コードは、グローバル一式を (順不同で) 定義し、繰り返すことにより、グローバル・ノードが添え字により自動的にソートされることを示します。

 // Erase any existing data
 Kill ^TEST
 
 // Define a set of global nodes
 Set ^TEST("Cambridge") = ""
 Set ^TEST("New York") = ""
 Set ^TEST("Boston") = ""
 Set ^TEST("London") = ""
 Set ^TEST("Athens") = ""

 // Now iterate and display (in order)
 Set key = $Order(^TEST(""))
 While (key '= "") {
     Write key,!
     Set key = $Order(^TEST(key)) // next subscript
 }

グローバルが提供する自動ソートをアプリケーションで活用すると、ソート処理や、順序付けされた相互参照付インデックスを特定値に保持する処理などが可能です。InterSystems SQL と ObjectScript は、グローバルを使用してこのようなタスクを自動的に実行します。

グローバル・ノードの照合

グローバルのノードがソートされる順序 (照合と呼びます) は、グローバル自体とそのグローバルを使用しているアプリケーションの 2 段階で制御されます。

アプリケーション・レベルでは、添え字として使用される値のデータ変換を行うことで、グローバル・ノードの照合方法を制御できます (InterSystems SQL とオブジェクトはユーザ指定の照合機能でこれを実行します)。例えば、大文字小文字は関係なくアルファベット順でソートされた名前リストを生成する場合、一般的にその名前を大文字で表記して添え字として使用します。

 // Erase any existing data
 Kill ^TEST
 
 // Define a set of global nodes for sorting
 For name = "Cobra","jackal","zebra","AARDVark" {
     // use UPPERCASE name as subscript
     Set ^TEST($ZCONVERT(name,"U")) = name
 }

 // Now iterate and display (in order)
 Set key = $Order(^TEST(""))
 While (key '= "") {
     Write ^TEST(key),!  // write untransformed name
     Set key = $Order(^TEST(key)) // next subscript
 }

この例は、添え字が大文字小文字を区別せずにソートされるように、名前をそれぞれ大文字に変換します ($ZCONVERT 関数を使用します)。元の値が表示されるように、各ノードには未変換の値を保持します。

数値添え字と文字列値添え字

数値は文字列値より先に照合されます。つまり、1 の値は “a” の値よりも先に処理されます。指定された添え字に対して数値と文字列値の両方を使用する場合は、この事実は認識しておく必要があります。(値を基にデータをソートするため) インデックスにグローバルを使用する場合、通常、値は数字 (例えば給与) としてソートするか、文字列 (例えば郵便番号) としてソートします。

数値的に照合されたノードに対する一般的な解決法としては、単項演算子 + を使用して、添え字値を強制的に数値にします。例えば、id 値を age でソートするインデックスを構築する場合、以下のように age が必ず数値になるように強制できます。

 Set ^TEST(+age,id) = ""

値を文字列としてソートする場合は (例えば “0022”、“0342”、“1584”)、スペース文字 (“ ”) を付けることで、添え字値が必ず文字列となるように強制できます。例えば、id 値を zipcode (郵便番号) でソートするインデックスを構築する場合、以下のように zipcode が必ず文字列になるように強制できます。

 Set ^TEST(" "_zipcode,id) = ""

これにより、“0022” など、先頭に 0 が付く値は常に文字列として扱われます。

$SORTBEGIN 関数と $SORTEND 関数

通常、InterSystems IRIS 内データのソートに関しては心配する必要はありません。SQL を使用するか直接グローバル・アクセスを使用するかによって、自動的にソート処理されます。

しかし、場合によっては、さらに効率的なソート処理が可能な場合もあります。特に、(1) 順不同 (つまりソートされていない状態) で多数のグローバル・ノードを設定する必要があり、(2) 結果グローバルの合計サイズが InterSystems IRIS バッファ・プールの大部分を占める場合は、(データがキャッシュに収まりきらないので) SET 処理の多くはディスクで処理されるようになります。この結果、パフォーマンスが悪影響を受けることがあります。通常は、一時グローバルの大容量データのロード、インデックスの集合、インデックスなしの値のソートなど、インデックス・グローバルの生成にかかわる場合、上記のような状況になります。

これらの状況に効率的に対処するため、ObjectScript では $SORTBEGIN 関数と $SORTEND 関数が用意されています。$SORTBEGIN 関数はグローバル (またはその部分) の特別ノードを初期化します。グローバルへのデータ・セットはスクラッチ・バッファに書き込まれ、メモリ (または一時ディスク・ストレージ) でソートされます。$SORTEND 関数が処理の最後に呼び出されると、データは実際のグローバル・ストレージに順に書き込まれます。ディスク処理を以前ほど要求されずに、書き込みが適切に終了しているため、操作全体がより効率的です。

$SORTBEGIN 関数の使用法は非常に簡単です。ソートを開始する前にソート対象のグローバル名で起動し、処理が完了した時点で $SORTEND を呼び出します。

 // Erase any existing data
 Kill ^TEST

 // Initiate sort mode for ^TEST global
 Set ret = $SortBegin(^TEST)

 // Write random data into ^TEST
 For i = 1:1:10000 {
     Set ^TEST($Random(1000000)) = ""
 }

 Set ret = $SortEnd(^TEST)

 // ^TEST is now set and sorted

 // Now iterate and display (in order)
 Set key = $Order(^TEST(""))
 While (key '= "") {
     Write key,!
     Set key = $Order(^TEST(key)) // next subscript
 }

$SORTBEGIN 関数はグローバル作成の特殊なケースに対して設計されており、使用の際には注意が必要です。特に $SORTBEGIN モードの場合、書き込みをしているグローバルからの読み取りはできません。これは、データが書き込まれていないと、読み取りが正しく行われないためです。

InterSystems SQL は自動的にこれらの関数を使用して、一時インデックス・グローバルを作成します。これは、インデックスの付いていないフィールドでのソート処理などで使用します。

グローバルを使用した間接演算の使用法

間接演算を使用して、ObjectScript は実行時のグローバル参照の作成方法を提供します。これはプログラムの完了時、グローバル構造や名前がわからないアプリケーションにおいて便利です。

間接演算は間接演算子 @ でサポートされ、式を含んだ文字列をデリファレンスします。間接演算には @ 演算子の使用法によって複数のタイプがあります。

以下のコードは、グローバル参照を含む文字列をデリファレンスするときに @ 演算子を使用する、名前間接演算の例を提供します。

 // Erase any existing data
 Kill ^TEST

 // Set var to an global reference expression
 Set var = "^TEST(100)"

 // Now use indirection to set ^TEST(100)
 Set @var = "This data was set indirectly."

 // Now display the value directly:
 Write "Value: ",^TEST(100)

添え字間接演算を使用して、式 (変数またはリテラル値) を間接演算文内で混在させることもできます。

 // Erase any existing data
 Kill ^TEST

 // Set var to a subscript value
 Set glvn = "^TEST"

 // Now use indirection to set ^TEST(1) to ^TEST(10)
 For i = 1:1:10 {
     Set @glvn@(i) = "This data was set indirectly."
 }

 // Now display the values directly:
 Set key = $Order(^TEST(""))
 While (key '= "") {
     Write "Value ",key, ": ", ^TEST(key),!
     Set key = $Order(^TEST(key))
 }

間接演算は ObjectScript の基本機能で、グローバル参照に制限されません。詳細は、"間接 (@)" を参照してください。間接演算は直接アクセスほど効果的ではないので、その点を考慮して使用してください。

並行処理の管理

シングル・グローバル・ノードの設定、または検索はアトミックです。必ず、常に一定の結果が得られます。複数ノードの操作向けに、InterSystems IRIS は、ロックの取得および解放機能を提供しています。"ロックと並行処理の制御" を参照してください。

最新のグローバル参照のチェック

最新のグローバル参照は、ObjectScript の $ZREFERENCE 特殊変数に記録されます。$ZREFERENCE には、指定によって添え字と拡張グローバル参照など最新のグローバル参照が組み込まれています。$ZREFERENCE は、グローバル参照が成功したかどうか、あるいは指定グローバルが存在するかどうかを示すものではありません。InterSystems IRIS は、指定された最新のグローバル参照を記録しているにすぎません。

ネイキッド・グローバル参照

InterSystems IRIS は、添え字付きグローバル参照の後にグローバル名と添え字レベルを示すネイキッド・インジケータを設定します。その後、ネイキッド・グローバル参照を使用して、同じグローバルと添え字レベルに連続して参照を作成します。グローバル名と上位レベルの添え字は削除されます。これにより、同じ (または下位の) 添え字レベルの同じグローバルに対する参照の繰り返しを能率的に行います。

ネイキッド参照に下位の添え字レベルを指定すると、そのレベルに合わせてネイキッド・インジケータがリセットされます。したがって、ネイキッド・グローバル参照を使用する場合、常に最新のグローバル参照で構築した添え字レベルで作業することになります。

ネイキッド・インジケータ値は、$ZREFERENCE 特殊変数に記録されます。この値は NULL 文字列に初期化されます。ネイキッド・インジケータが設定されていない状態でネイキッド・グローバル参照を試みると、<NAKED> エラーが生じます。ネームスペースを変更すると、ネイキッド・インジケータも再初期化されます。$ZREFERENCE を NULL 文字列 ("") に設定することで、ネイキッド・インジケータを再初期化できます。

以下の例は、添え字付きのグローバル ^Produce("fruit",1) が最初の参照に指定されています。InterSystems IRIS は、このグローバル名と添え字をネイキッド・インジケータに保存します。したがって、後続のネイキッド・グローバル参照ではグローバル名 "Produce" と上位の添え字レベル "fruit" を省略できます。^(3,1) ネイキッド参照が下位の添え字レベルに移動した場合、この新規の添え字レベルが、その後に続くネイキッド・グローバル参照の条件となります。

   SET ^Produce("fruit",1)="Apples"  /* Full global reference  */
   SET ^(2)="Oranges"                /* Naked global references */
   SET ^(3)="Pears"                  /* assume subscript level 2 */
   SET ^(3,1)="Bartlett pears"       /* Go to subscript level 3  */
   SET ^(2)="Anjou pears"            /* Assume subscript level 3 */
   WRITE "latest global reference is: ",$ZREFERENCE,!
   ZWRITE ^Produce
   KILL ^Produce

この例は、グローバル変数 ^Produce("fruit",1)、^Produce("fruit",2)、^Produce("fruit",3)、^Produce("fruit",3,1)、^Produce("fruit",3,2) を設定します。

例外はありますが、ほとんどのグローバル参照 (完全あるいはネイキッド) がネイキッド・インジケータを設定します。$ZREFERENCE 特殊変数は、ネイキッド・グローバル参照の場合でも、最新のグローバル参照の完全なグローバル名と添え字を保持しています。ZWRITE コマンドも、ネイキッド参照を使用して設定したかどうかにかかわらず、各グローバルの完全な名前と添え字を表示します。

ネイキッド・グローバル参照は注意して使用する必要があります。InterSystems IRIS は、ネイキッド・インジケータを常に明確に設定するわけではないからです。以下はその例です。

  • ネイキッド・インジケータは、完全グローバル参照によって最初に設定されます。そのグローバル参照が失敗しても、それ以降の完全グローバル参照やネイキッド・グローバル参照によって、ネイキッド・インジケータが変更されます。例えば、存在しないグローバルの値を WRITE しようとすると、ネイキッド・インジケータが設定されます。

  • 添え字付きのグローバルを参照するコマンド後置条件では、InterSystems IRIS が後置条件を評価する方法に関係なく、ネイキッド・インジケータが設定されます。

  • 添え字付きのグローバルを参照するオプション関数の引数は、InterSystems IRIS がすべての引数を評価するかどうかによって、ネイキッド・インジケータを設定する場合としない場合があります。例えば、$GET の 2 番目の引数を指定すると、その既定値が使用されなくても、必ずネイキッド・インジケータが設定されます。InterSystems IRIS は、左から右の順番で引数を評価します。したがって、最後の引数は、最初の引数で設定されたネイキッド・インジケータをリセットする場合があります。

  • トランザクションをロールバックする TROLLBACK コマンドは、ネイキッド・インジケータをトランザクションの最初の値にはロールバックしません。

完全グローバル参照に拡張グローバル参照を含む場合、その後に続くネイキッド・グローバル参照は、同じ拡張グローバル参照と見なされます。つまり、ネイキッド・グローバル参照の一部として拡張参照を指定する必要はありません。

FeedbackOpens in a new tab