#
第四十六章 Caché 变量大全 ^$GLOBAL 变量 提供有关全局变量和进程私有全局变量的信息。 # 大纲 ```java ^$|nspace|GLOBAL(global_name) ^$|nspace|G(global_name) ^$||GLOBAL(global_name) ^$||G(global_name) ``` # 参数 - `|nspace|` 或 `[nspace]` - 可选-扩展SSVN引用,可以是显式名称空间名称,也可以是隐含名称空间。必须计算为带引号的字符串,该字符串括在方括号(`[“nspace”]`)或竖线(`|“nspace”|`)中。命名空间名称不区分大小写;它们以大写字母存储和显示。 - global_name 计算结果为包含无下标全局名称的字符串的表达式。全局名称区分大小写。使用`^$||global()`语法时,与进程专用全局名称相对应的无下标全局名称:`^a`表示`^||a`。 # 描述 可以将`^$GLOBAL`用作`$DATA`、`$ORDER`和`$QUERY`函数的参数,以返回有关当前名称空间(默认名称空间)或指定名称空间中是否存在全局变量的信息。还可以使用`^$global`返回有关存在进程私有全局变量的信息。 ## 进程私有全局变量 可以使用`^$global`获取有关所有命名空间中是否存在进程私有全局变量的信息。可以将进程专用全局的查找指定为`^$||global`或`^$|“^”|global`。 例如,要获取有关进程私有全局`^||a`及其后代的信息,可以指定`$DATA(^$||global(“^a”))`。进程私有全局变量不是特定于名称空间的,因此在定义进程私有全局变量时,无论当前名称空间如何,此查找都会返回有关`^||a`的信息。 请注意,`^$GLOBAL`不支持在`GLOBAL_NAME`本身中指定进程专用全局语法。使用进程专用全局语法指定`GLOBAL_NAME`会导致``错误。 # 参数 ## nspace 此可选参数允许`^$GLOBAL`查找在另一个命名空间中定义的`GLOBAL_NAME`。这称为扩展SSVN参考。可以显式地将命名空间名称指定为带引号的字符串文字、变量,也可以通过指定隐含的命名空间来指定。命名空间名称不区分大小写。可以使用方括号语法`[“user”]`或环境语法`|“user”|`。Nspace分隔符前后不允许有空格 可以使用以下方法测试是否定义了命名空间: ```java DHC-APP>WRITE ##class(%SYS.Namespace).Exists("USER") 1 DHC-APP>WRITE ##class(%SYS.Namespace).Exists("LOSER") 0 ``` 以使用`$NAMESPACE`特殊变量来确定当前名称空间。更改当前名称空间的首选方式是新建`$NAMESPACE`,然后设置`$NAMESPACE=“nspace ename”`。 ## global_name 计算结果为包含无下标全局名称的字符串的表达式。全局变量区分大小写。 - `^$global(“^a”)`:`global_name“^a”`在当前名称空间中查找此全局名称及其后代。它不查找进程私有全局`“^||a”`。 - `^$|"USER"|GLOBAL("^a")`:global_name `"^a"`在`“user”`名称空间中查找此全局名称及其后代。它不查找进程-私有全局`"^||a"`。 -` ^$||GLOBAL("^a")`:global_name `"^a"`在所有名称空间中查找进程私有全局`"^||a"`及其后代。它不查找全`"^a"`。 # 示例 以下示例显示如何将`^$GLOBAL`用作`$DATA`、`$ORDER`和`$QUERY`函数的参数。 ## 作为`$DATA`的参数 `^$GLOBAL`作为`$DATA`的参数返回一个整数值,表示指定的全局名称是否作为`^$GLOBAL`节点存在。下表显示了`$DATA`可以返回的整数值。 Value | Meaning ---|--- 0| 全局名称不存在 1| 全局名称是包含数据但没有子代的现有节点。 10| 全局名称是没有数据但具有子代的现有节点。 11| 全局名称是包含数据的现有节点,并且具有子代。 下面的示例测试当前命名空间中是否存在指定的全局变量: ```java /// d ##class(PHA.TEST.SpecialVariables).GLOBAL() ClassMethod GLOBAL() { KILL ^GBL WRITE $DATA(^$GLOBAL("^GBL")),! SET ^GBL="test" WRITE $DATA(^$GLOBAL("^GBL")),! SET ^GBL(1,1,1)="subscripts test" WRITE $DATA(^$GLOBAL("^GBL")) } ``` ```java DHC-APP>d ##class(PHA.TEST.SpecialVariables).GLOBAL() 0 1 11 ``` 下面的示例测试user命名空间中是否存在指定的全局变量: ```java /// d ##class(PHA.TEST.SpecialVariables).GLOBAL1() ClassMethod GLOBAL1() { SET $NAMESPACE="USER" SET ^GBL(1)="test" SET $NAMESPACE="%SYS" WRITE $DATA(^$|"USER"|GLOBAL("^GBL")) } ``` ```java DHC-APP>d ##class(PHA.TEST.SpecialVariables).GLOBAL1() 10 ``` 下面的示例测试任何命名空间中是否存在指定的进程私有全局变量: ```java /// d ##class(PHA.TEST.SpecialVariables).GLOBAL2() ClassMethod GLOBAL2() { SET $NAMESPACE="USER" SET ^||PPG(1)="test" SET $NAMESPACE="%SYS" WRITE $DATA(^$||GLOBAL("^PPG")) } ``` ```java DHC-APP>d ##class(PHA.TEST.SpecialVariables).GLOBAL2() 10 ``` ## 作为`$ORDER`的参数 `$ORDER(^$|nspace|GLOBAL( global_name),direction)` `^$GLOBAL`作为`$ORDER`的参数,将排序序列中的下一个或上一个全局名称返回到指定的全局名称。如果`^$GLOBAL`中不存在这样的全局名称节点,`$ORDER`将返回空字符串。 注意:`$ORDER(^$GLOBAL(NAME))`不会从IRISSYS数据库返回`%global names`。 Direction参数指定是返回下一个全局名称还是返回上一个全局名称。如果不提供方向参数,InterSystems IRIS会将排序顺序中的下一个全局名称返回给您指定的全局名称。 以下子例程搜索当前名称空间,并将全局名称存储在名为global的本地数组中。 ```java /// d ##class(PHA.TEST.SpecialVariables).GLOBAL3() ClassMethod GLOBAL3() { GLOB SET NAME="" WRITE !,"以下全局变量在 ",$NAMESPACE FOR I=1:1 { SET NAME=$ORDER(^$GLOBAL(NAME)) WRITE !,NAME QUIT:NAME="" SET GLOBAL(I)=NAME } WRITE !,"全部完成" QUIT } ``` ```java DHC-APP>d ##class(PHA.TEST.SpecialVariables).GLOBAL3() 以下全局变量在 DHC-APP ^%ISCWorkQueue ^%cspSession ^%qCacheMsg ^%qCacheMsgNames ^%qCacheObjectErrors ^%qCacheObjectKey ^%qCacheObjectQualifier ^%qCacheSQL ^%qHTMLElementD ^%qJavaMetaDictionary ^%qMgtPortal.Index ^%qPublicSuffix ^%qStream ^%qcspRule ^A ^AA Visible+4^%SYS.GD DHC-APP> ``` ## 作为`$QUERY`的参数 `^$GLOBAL`作为`$QUERY`的参数,按排序顺序将下一个全局名称返回到指定的全局名称。如果`^$GLOBAL`中不存在这样的全局名称作为节点,则`$QUERY`将返回空字符串。 注意:`$QUERY(^$GLOBAL(NAME))`不会从IRISSYS数据库返回`%GLOBAL NAMES`。 在以下示例中,用`user`命名空间中存在三个全局变量(`^GBL1`、`^GBL2`和`^GBL3`)。 ```java /// d ##class(PHA.TEST.SpecialVariables).GLOBAL4() ClassMethod GLOBAL4() { NEW $NAMESPACE SET $NAMESPACE="USER" SET (^GBL1,^GBL2,^GBL3)="TEST" NEW $NAMESPACE SET $NAMESPACE="%SYS" WRITE $QUERY(^$|"USER"|GLOBAL("^GBL1")),! WRITE $QUERY(^$|"USER"|GLOBAL("^GBL2")) NEW $NAMESPACE SET $NAMESPACE="USER" KILL ^GBL1,^GBL2,^GBL3 } ``` ```java DHC-APP>d ##class(PHA.TEST.SpecialVariables).GLOBAL4() ^$|"USER"|GLOBAL("^GBL2") ^$|"USER"|GLOBAL("^GBL3") ``` ## 作为`MERGE`的参数 `^$GLOBAL`作为`MERGE`命令的源参数,将全局目录复制到目标变量。`Merge`将每个全局名称添加为具有空值的目标下标。下面的示例显示了这一点: ```java MERGE gbls=^$GLOBAL("") ZWRITE gbls ``` ```java ... gbls("^zlgsql")="" gbls("^zlgtem")="" gbls("^zlgtem1")="" gbls("^zlgtem4")="" gbls("^zlgtemp")="" gbls("^zlgtemp1")="" gbls("^zlgtemp3")="" gbls("^zlgtemp5")="" gbls("^zlgtmp")="" gbls("^zlj")="" gbls("^zll")="" gbls("^zltmp")="" gbls("^zmc")="" gbls("^znum")="" 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")="" ```