Skip to main content

MERGE (ObjectScript)

グローバル・ノード、もしくはサブツリーをソースから宛先にマージします。

構文

MERGE:pc mergeargument,...
M:pc mergeargument,...

mergeargument には、以下を指定できます。

destination=source

引数

引数 説明
pc オプション — 後置条件式
destination および source マージされるローカル変数、プロセス・プライベート・グローバル、またはグローバル。クラス・プロパティとして指定された場合、source 変数は、多次元の (添え字付き) 変数である必要があります。

概要

MERGE destination=sourcesourcedestination にコピーし、source のすべての下位を destination の下位にコピーします。これは、source を変更したり、destination のノードを削除することはありません。

MERGE は、ある変数のサブツリー (複数の添え字) を別の変数にコピーします。変数は、添え字付きのローカル変数、プロセス・プライベート・グローバル、またはグローバルのいずれかです。サブツリーとは、特定の変数の子孫であるすべての変数です。

MERGE は、sourcedestination が親子リレーションシップである場合に <COMMAND> エラーを発行します。

MERGE の実行

MERGE はアトミック処理ではありません。

MERGE コマンドの実行には、他のほとんどの ObjectScript コマンドよりも時間がかかります。その結果、割り込みを受ける可能性も高くなります。割り込みによって、コピー先のサブツリーに、ソースから予測できないサブセットがコピーされる可能性があります。

他のプロセスが同時にデータ変更操作を実行中に MERGE を実行した場合、destination の内容は、MERGE の開始時点でのデータの状態から、MERGE 操作の終了時に KILL で削除された変数を除いたものになります。MERGE 処理中に行われた他のデータ変更は、destination の内容に反映されない場合があります。

引数

pc

オプションの後置条件式。InterSystems IRIS® データ・プラットフォームは、後置条件式が True (0 以外の数値に評価される) の場合に MERGE コマンドを実行します。InterSystems IRIS は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。詳細は、"コマンド後置条件式" を参照してください。

destination および source

マージされる変数。変数は、ローカル変数、プロセス・プライベート・グローバル、またはグローバルのいずれかです。destination が未定義の場合、MERGE は定義を行い、source に設定します。source が未定義の場合、MERGE は正常に終了しますが、destination を変更しません。

ユーザは、複数のコンマ区切りの destination=source の組み合わせを指定することができます。これらは、左から右の順に評価されます。

mergeargument は、destination=source ペアを 間接演算で参照できます。例 : MERGE @tMergeString

mergeargument には、myargs... などで可変個数のパラメータを指定する参照によって渡される配列を指定できます。

^$GLOBAL SSVN には source 変数を指定できます。これにより、グローバル・ディレクトリが destination 変数にコピーされます。MERGE は、各グローバル名を、NULL 値を持つ destination 添え字として追加します。以下に例を示します。

   MERGE gbls=^$GLOBAL("")
   ZWRITE gbls

以下の例では、グローバル変数 (^a) から別のグローバル変数 (^b) にサブツリーをコピーします。この場合は、マージの使用によって、より小さいグローバル ^b が作成され、これには ^a にある情報の ^a(1,1) サブツリーのみが含まれます。

   SET ^a="cartoons"
   SET ^a(1)="The Flintstones",^a(2)="The Simpsons"
   SET ^a(1,1)="characters",^a(1,2)="place names"
   SET ^a(1,1,1)="Flintstone family"
   SET ^a(1,1,1,1)="Fred"
   SET ^a(1,1,1,2)="Wilma"
   SET ^a(1,1,2)="Rubble family"
   SET ^a(1,1,2,1)="Barney"
   SET ^a(1,1,2,2)="Betty"
   MERGE ^b=^a(1,1)
   WRITE ^b,!,^b(2),!,^b(2,1)," and ",^b(2,2)

以下の例では、コピー元のグローバル変数のサブツリーが結合された後の、コピー先のグローバル変数を示しています。

以下を実行するとします。

  KILL ^X,^Y
  SET ^X(2,2)="first"
  SET ^X(2,2,4)="second"
  SET ^Y(3,6,7)="third"
  SET ^Y(3,6,8)="fourth"
  SET ^Y(3,6,7,8,4)="fifth"
  SET ^Y(3,6,7,8,9)="sixth"
  WRITE ^X(2,2),!,^X(2,2,4),!
  WRITE ^Y(3,6,7),!,^Y(3,6,8),!
  WRITE ^Y(3,6,7,8,4),!,^Y(3,6,7,8,9)

以下の図は、実行後の ^X と ^Y の論理構造を示しています。

^X と ^Y の初期構造
添え字のツリー構造。^X には、各レベルにノードが 1 つずつあります。^Y には、(3,6) にノードが 2 つあり、(3,6,7,8) にも (3,6,7,8,4) と (3,6,7,8,9) の 2 つのノードがあります。

以下の MERGE コマンドを考えてみましょう。

  MERGE ^X(2,3)=^Y(3,6,7,8)

前の文を実行すると、InterSystems IRIS は ^Y の一部を ^X(2,3) にコピーします。グローバル ^X は、以下の図のような構造になります。

^X および ^Y の MERGE コマンドの結果
^X ツリー構造 : ^X には元からあったノード : (2)、(2,2)、(2,2,4) と、^Y ツリーからマージされたノード : (2,3)、(2,3,4)、(2,3,9) があります

ネイキッド・インジケータ

destination および source の両方がローカル変数である場合、ネイキッド・インジケータは変更されません。source がグローバル変数で、destination がローカル変数の場合は、ネイキッド・インジケータは source を参照します。

source および destination の両方がグローバル変数である場合、ネイキッド・インジケータの状態は、source が未定義 ($DATA(source)=0) であれば変更されません。これ以外の場合 ($DATA(source)=10 の場合)、ネイキッド・インジケータは、SET コマンドを MERGE コマンドと置き換え、source が値を持っているとして実行した場合と同じ値を取ります。ネイキッド・インジケータの詳細は、"最新のグローバル参照のチェック" を参照してください。

自己マージ

destinationsource が同じ変数のとき、マージは行われず、ジャーナル・ファイルにも何も記録されません。しかし以前のセクションで説明された規定に基づいて、ネイキッド・インジケータは変更されます。

ウォッチポイント

MERGE コマンドはウォッチポイントをサポートしています。ウォッチポイントが有効になっている場合、MERGE が監視対象変数の値を変更するたびに、InterSystems IRIS はウォッチポイントをトリガします。ウォッチポイントを設定するには、ZBREAK コマンドを使用します。

関連項目

FeedbackOpens in a new tab