Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

$QUERY

ローカル配列とグローバル配列の物理的スキャンを行います。

Synopsis

$QUERY(reference,direction,target)
$Q(reference,direction,target)

パラメータ

reference パブリック・ローカル変数名とグローバル変数名 (およびオプションとしてその添え字) に評価される参照。
direction オプション — 配列を検索する方向 (前方または後方)。
target オプションreference で指定したローカル変数とグローバル変数の現在のデータ値を返します。

概要

$QUERY はパブリック・ローカル配列とグローバル配列を物理的にスキャンします。順番で、指定した配列ノードの次にある、定義されたノードの完全参照 (名前と添え字) を返します。そのようなノードが存在しない場合、$QUERY は NULL 文字列を返します。

パラメータ

reference

このパラメータは、パブリック変数またはグローバル変数に評価される必要があります。$QUERY は、プライベート変数をスキャンできません。

返されるグローバル参照は、同じ下位レベルか、reference パラメータで指定された上位レベルです。添え字を指定せずに reference を指定すると、$QUERY は配列内で最初に定義されたノードを返します。

direction

direction が指定されていない場合、既定の方向は前方向です。方向を指定したい場合は、パラメータ値の 1 が配列を前方向に、パラメータ値 -1 が配列を後方向に検索します。

target

target を指定したい場合は、direction を指定する必要があります。reference パラメータ内で識別される変数が定義されていない場合、target 値は変化しません。

ZBREAK コマンドでは、ウォッチポイントとしての target パラメータは指定できません。

以下の例は、ユーザ指定配列の全ノードのデータ値を出力するための汎用ルーチンを示しています。任意のレベル数の配列に対応できます。コードは、$ORDER 関数の例にあるコードと同じ処理を実行します。23 行が必要になるのではなく、6 行のみが必要になります。処理できるレベル数についての制限はありません。

Start  READ !,"Array name: ",ary QUIT:ary=""
  SET queryary=$QUERY(@ary@(""))
  WRITE !,@queryary
  FOR   {
    SET queryary=$QUERY(@queryary) 
        QUIT:queryary=""  
        WRITE !,@queryary
  }
  WRITE !,"Finished."
  QUIT

最初の SET コマンドは、添え字付き間接指定を持つ $QUERY を使用して、データを含む最初の既存ノードにグローバル参照を初期化します。詳細は、"Caché ObjectScript の使用法" の "間接演算" を参照してください($ORDER のように、$QUERY は NULL 文字列を受け入れ、配列の最初の添え字を指定します)。最初の WRITE コマンドは、最初に見つかったノードの値を出力します。省略すると、最初のノードはスキップされます。

FOR ループでは、$QUERY は、次のノードを検索して、グローバル参照を更新するのに使用されます。その後グローバル参照の内容は WRITE コマンドで出力します。後置条件付きの QUIT は、$QUERY が配列の最後に到達したことを示す NULL 文字列 ("") を見つけると、ループを終了します。

ポインタ・ノード ($DATA=11) と端末ノード ($DATA=1) を見分ける場合以外には、$DATA テストは必要ありません。

メモ

配列を検索する $QUERY の使用法

$QUERY を繰り返し使用すると、定義されているノードを順番に返しながら、配列全体を左から右、上から下に検索できます。$QUERYreference で指定した添え字により決定されるポイントから開始できます。水平軸と垂直軸の両方を使用して処理します。以下はその例です。

   SET exam=$QUERY(^client(4,1,2))

この例に基づいて、$QUERY は 3 レベル配列を仮定し、以下の値のうちのいずれかを返す場合があります。

以下の場合に $QUERY により返される
^client(4,1,3) ^client(4,1,3) が存在してデータを含む場合。
^client(4,2) ^client(4,1,3) またはそのデータは存在しないが、^client(4,2) が存在してデータを含む場合。
^client(5) ^client(4,1,3) と ^client(4,2) は存在しないか、またはデータを含まず、^client(5) が存在してデータを含む場合。
NULL 文字列 ("") 以前のグローバル参照が一切存在せず、データも含まない場合。$QUERY は配列の最後に到達しています。

$QUERY は、direction 値 -1 を使用して、配列全体を逆方向に、右から左、下から上へと検索します。

$ORDER と比較しての $QUERY

$QUERY がグローバル参照全体を返すのに対し、$ORDER は次のノードの添え字のみを返すため、この 2 つの関数は異なります。$ORDER は、1 つのレベルのノード全体で、水平軸のみに沿って進みます。

$QUERY は、データを含む既存のノードのみを選択するという点でも、$ORDER とは異なります。$ORDER は、データを含むか否かに関係なく、既存のノードを選択します。$ORDER は存在の暗黙のテストを行いますが ($DATA'=0)、$QUERY は存在とデータ両方の暗黙のテストを行います ($DATA'=0 and $DATA'=10)。しかし、$QUERY は、データを含むポインタ・ノード ($DATA=11) と終端ノード ($DATA=1) を識別しません。この識別を行うには、コードに適切な $DATA テストを含める必要があります。

$ORDER と同様、$QUERY は、通常、連続した整数の添え字を使用しない配列のノードを検索するために、ループ処理と共に使用されます。$QUERY は、値を持つ次のノードのグローバル参照を返すだけです。$QUERY は、グローバル配列をアクセスするための非常に密度の高いコードを提供しています。

$NAME 関数と $ORDER 関数同様、$QUERY は、ネイキッド・グローバル参照と共に使用できます。これは配列名なしで指定され、直前に実行されたグローバル参照を指定します。以下はその例です。

   SET a=^client(1)
   SET x=2
   SET z=$QUERY(^(x))

最初の SET コマンドは、参照レベルを含む現在のグローバル参照を作成します。2 番目の SET コマンドは、添え字と共に使用する変数を設定しています。$QUERY 関数は、ネイキッド・グローバル参照を使用して、^client(2) の次のノードのグローバル参照全体を返します。例えば返り値は、^client(2,1) あるいは ^client(3) になります。

$QUERY と拡張グローバル参照

%SYSTEM.ProcessOpens in a new tab クラスの RefInKind()Opens in a new tab メソッドを使用して、$QUERY が拡張グローバル参照形式でグローバル参照を返すかどうかを、プロセスごとに制御できます。システム全体の既定の動作は、Config.MiscellaneousOpens in a new tab クラスの RefInKindOpens in a new tab プロパティで設定できます。

拡張グローバル参照に関する詳細は、"Caché グローバルの使用法" の "グローバル構造" の章を参照してください。

関連項目

FeedbackOpens in a new tab