第十七章 Caché 命令大全 MERGE 命令

文章目录

第十七章 Caché 命令大全 MERGE 命令

将全局节点或子树从源合并到目标。

重点

  1. Merge命令执行时间可能会比较长。
  2. 注意合并的树状结构节点,规则。
  3. 查询临时globe

大纲

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

其中Mergeargument为:

destination=source

参数

  • pc 可选,后置表达式
  • destination and source 局部变量、进程私有全局变量或要合并的全局变量。如果指定为类属性,则源变量必须是多维(下标)变量。

描述

MERGE destination=source 将源复制到目标,并将源的所有后代复制到目标的后代。它不修改源,也不终止目标中的任何节点。
MERGE 简化了将变量的子树(多个下标)复制到另一个变量的过程。这两个变量都可以是带下标的局部变量、进程私有全局变量或全局变量。子树是指定变量的后代的所有变量。Merge为当前的子树复制技术提供了一个命令替代方案:一系列带有$ORDER引用的SET命令。

如果源和目标具有父子关系,则MERGE会发出<command>错误。

Merge命令的执行时间可能比大多数其他CachéObjectScript命令都长。因此,它更容易被中断。中断的影响是特定于实现的。在Caché下,中断可能会导致源的不可预知子集被复制到目标子树。

参数

pc

可选的后置条件表达式。如果后置条件表达式为TRUE(计算结果为非零数值),则Caché执行MERGE 命令。如果后置条件表达式为假(计算结果为零),则Caché不执行该命令。

destination and source

要合并的变量。这两个变量都可以是局部变量、进程私有全局变量或全局变量。如果未定义目标,则合并将其定义并将其设置为源。如果未定义源,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的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tjTFQewh-1594947516651)(1A3C0B3035694130B09C2F3030787001)]

注意

裸指示器

当目标和源都是局部变量时,裸指示符不会更改。 如果source是全局变量,而Destination是局部变量,则裸指示符引用source。
当源和目标都是全局变量时,如果未定义源($data(Source)=0),则裸指示符不会改变。在所有其他情况下(包括$DATA(SOURCE)=10),裸露指示符采用的值与设置命令替换MERGE命令并且SOURCE具有值时的值相同。

合并到自身

当目标和源是同一变量时,不会发生合并。日记文件中没有记录任何内容。但是,根据上一节中介绍的规则,可以更改裸体指示器。

观察点

MERGE命令支持观察点。如果某个观察点有效,则只要合并更改了受监视变量的值,Caché就会触发该观察点。要设置观察点,请使用ZBREAK命令。

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/107400177
今日推荐