将全局节点或子树从源合并到目标。
Merge
命令执行时间可能会比较长。MERGE:pc mergeargument,...
M:pc mergeargument,...
其中Mergeargument为:
destination=source
MERGE destination=source
将源复制到目标,并将源的所有后代复制到目标的后代。它不修改源,也不终止目标中的任何节点。
MERGE
简化了将变量的子树(多个下标)复制到另一个变量的过程。这两个变量都可以是带下标的局部变量、进程私有全局变量或全局变量。子树是指定变量的后代的所有变量。Merge
为当前的子树复制技术提供了一个命令替代方案:一系列带有$ORDER
引用的SET
命令。
如果源和目标具有父子关系,则MERGE
会发出
错误。
Merge
命令的执行时间可能比大多数其他CachéObjectScript命令都长。因此,它更容易被中断。中断的影响是特定于实现的。在Caché下,中断可能会导致源的不可预知子集被复制到目标子树。
可选的后置条件表达式。如果后置条件表达式为TRUE(计算结果为非零数值),则Caché执行MERGE
命令。如果后置条件表达式为假(计算结果为零),则Caché不执行该命令。
要合并的变量。这两个变量都可以是局部变量、进程私有全局变量或全局变量。如果未定义目标,则合并将其定义并将其设置为源。如果未定义源,MERGE
将成功完成,但不会更改目标。
可以指定多个逗号分隔的Destination=Source
。它们按从左到右的顺序进行计算。
Mergeargument可以间接引用Destination=Source
对。例如,MERGE @tMergeString
。
mergeargument可以是通过引用传递的数组,该数组指定可变数量的参数,例如myargs
.
^$GLOBAL SSVN
可以是源变量。这会将全局变量目录复制到目标变量。Merge
将每个全局名称添加为具有空值的目标下标。
下面的示例显示了这一点:
DHC-APP> MERGE gbls=^$GLOBAL("")
...
gbls("^zpeterc")=""
gbls("^zsb")=""
gbls("^zseq")=""
gbls("^zstock")=""
gbls("^ztTmp")=""
gbls("^ztrap1")=""
gbls("^zwb1")=""
gbls("^zwhtmp")=""
gbls("^zx")=""
gbls("^zx1")=""
gbls("^zx2")=""
gbls("^zxdd")=""
gbls("^zyb")=""
gbls("^zyb1")=""
gbls("^zyb2")=""
gbls("^zyl")=""
gbls("^zzTT")=""
gbls("^zzdt")=""
gbls("^zzp")=""
gbls("^zzy")=""
gbls("^zzz")=""
...
下面的示例将子树从一个全局变量(^a
)复制到另一个全局变量(^b
)。在本例中,合并用于创建较小的全局变量^b
,它仅包含^a
中信息的^a(1,1)
子树。
/// d ##class(PHA.TEST.Command).TestMerge()
ClassMethod TestMerge()
{
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)
}
DHC-APP>d ##class(PHA.TEST.Command).TestMerge()
characters
Rubble family
Barney and Betty
以下示例显示了目标全局变量与源全局变量的子树合并后的外观.
假设执行以下命令:
/// d ##class(PHA.TEST.Command).TestMerge1()
ClassMethod TestMerge1()
{
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
的初始结构
考虑以下Merge
命令:
MERGE ^X(2,3)=^Y(3,6,7,8)
发出上一条语句时,Caché会将^Y
的一部分复制到^X(2,3)
中。现在,全局变量^X
的结构如下图所示。
Merge
命令的^X
和^Y
的结果
当目标和源都是局部变量时,裸指示符不会更改。 如果source是全局变量,而Destination是局部变量,则裸指示符引用source。
当源和目标都是全局变量时,如果未定义源($data(Source)=0
),则裸指示符不会改变。在所有其他情况下(包括$DATA(SOURCE)=10
),裸露指示符采用的值与设置命令替换MERGE命令并且SOURCE具有值时的值相同。
当目标和源是同一变量时,不会发生合并。日记文件中没有记录任何内容。但是,根据上一节中介绍的规则,可以更改裸体指示器。
MERGE
命令支持观察点。如果某个观察点有效,则只要合并更改了受监视变量的值,Caché就会触发该观察点。要设置观察点,请使用ZBREAK
命令。