文章目录
-
第十七章 Caché 命令大全 MERGE 命令 - 重点
- 大纲
- 参数
- 描述
- 参数
- pc
- destination and source
- 示例
- 注意
- 裸指示器
- 合并到自身
- 观察点
第十七章 Caché 命令大全 MERGE 命令
将全局节点或子树从源合并到目标。
重点
Merge命令执行时间可能会比较长。- 注意合并的树状结构节点,规则。
- 查询临时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)]](https://file2.kaopuke.com:8081/files_image/2023060522/20200717090009518.png)
注意
裸指示器
当目标和源都是局部变量时,裸指示符不会更改。 如果source是全局变量,而Destination是局部变量,则裸指示符引用source。
当源和目标都是全局变量时,如果未定义源($data(Source)=0),则裸指示符不会改变。在所有其他情况下(包括$DATA(SOURCE)=10),裸露指示符采用的值与设置命令替换MERGE命令并且SOURCE具有值时的值相同。
合并到自身
当目标和源是同一变量时,不会发生合并。日记文件中没有记录任何内容。但是,根据上一节中介绍的规则,可以更改裸体指示器。
观察点
MERGE命令支持观察点。如果某个观察点有效,则只要合并更改了受监视变量的值,Caché就会触发该观察点。要设置观察点,请使用ZBREAK命令。
最后
以上就是俊逸帅哥最近收集整理的关于第十七章 Caché 命令大全 MERGE 命令 第十七章 Caché 命令大全 MERGE 命令 重点大纲描述参数示例注意的全部内容,更多相关第十七章内容请搜索靠谱客的其他文章。
发表评论 取消回复