第十章 Caché 变量大全 $NAMESPACE 变量
包含当前堆栈级的命名空间。
大纲
$NAMESPACE
SET $NAMESPACE=namespace
NEW $NAMESPACE
参数
- namespace 现有命名空间的名称,指定为文字引号字符串或解析为引号字符串的表达式。命名空间名称不区分大小写。
描述
$NAMESPACE
包含当前堆栈级别的当前命名空间的名称。可以使用$NAMESPACE
执行以下操作:
- 返回当前命名空间的名称。
- 使用
Set
更改当前命名空间。 - 使用
new
和set
建立新的临时命名空间上下文。
返回当前命名空间名称
$NAMESPACE
特殊变量包含当前名称空间名称。
还可以通过调用%SYSTEM.SYS
类的Namespace()
方法来获取当前命名空间的名称,如下所示:
DHC-APP>WRITE $SYSTEM.SYS.NameSpace()
DHC-APP
可以使用%Library.File
类的NormalizeDirectory()
方法获取当前命名空间的完整路径名,如下所示:
DHC-APP>WRITE $NAMESPACE,!
DHC-APP
DHC-APP>WRITE ##class(%Library.File).NormalizeDirectory("")
E:\DtHealth\db\dthis\data\
可以使用%SYS.Namespace
类的Existes()
方法测试命名空间是否已定义,如下所示:
DHC-APP>WRITE ##class(%SYS.Namespace).Exists("USER")
1
DHC-APP>WRITE ##class(%SYS.Namespace).Exists("LOSER")
0
SET $NAMESPACE
可以使用set
命令将$NAMESPACE
设置为现有名称空间。在SET $NAMESPACE=NAMESPACE
中,将NAMESPACE
指定为带引号的字符串文字或计算结果为带引号的字符串的变量或表达式;NAMESPACE
不区分大小写。但是,Caché总是以全大写字母显示显式名称空间名称,以全小写字母显示隐含的名称空间名称。名称空间名称可以包含Unicode字母字符;Caché将重音小写字母转换为相应的重音大写字母。
名称空间名称可以是显式名称空间名称(“user”
),也可以是隐式名称空间(“^^c:\InterSystems\Cache\Mgr\user\”
)。
如果指定的名称空间不存在,则SET $NAMESPACE
生成<NAMESPACE>
错误。如果没有对名称空间的访问权限,则系统将生成<PROTECT>
错误,后跟数据库路径。例如,%Developer
角色没有对%SYS
命名空间的访问权限。如果具有此角色并尝试访问该名称空间,则Caché会发出以下错误(在Windows系统上):<PROTECT> *c:\intersystems\cache\mgr\.
当希望临时更改当前名称空间时,请执行一些操作,然后还原到先前的名称空间,请使用SET $NAMESPACE
,而不要使用SET $ZNSPACE
或ZNSPACE
命令。这是因为$NAMESPACE
允许使用NEW $NAMESPACE
。
NEW $NAMESPACE
通过设置$NAMESPACE
,可以更改当前名称空间。这是在方法或其他例程中更改名称空间的首选方法。通过使用NEW $NAMESPACE
和SET $NAMESPACE
,可以建立一个命名空间上下文,当方法结束或发生意外错误时,它会自动恢复为先前的命名空间:
/// d ##class(PHA.TEST.SpecialVariables).NAMESPACE()
ClassMethod NAMESPACE()
{
TRY {
WRITE "方法之前: ",$NAMESPACE,!
DO MyNSMethod("DocBook")
WRITE "方法之后: ",$NAMESPACE
RETURN
MyNSMethod(ns)
NEW $NAMESPACE
IF ##class(%SYS.Namespace).Exists(ns) {
SET $NAMESPACE=ns
} ELSE {
SET $NAMESPACE="User"
}
WRITE "方法中的命名空间已更改: ",$NAMESPACE,!
SET num=5/$RANDOM(2)
QUIT
NextMethod()
WRITE "这不会执行",!
}
CATCH exp {
WRITE "方法错误后的命名空间: ",$NAMESPACE,!
IF 1=exp.%IsA("%Exception.SystemException") {
WRITE "系统异常: ",$ZCVT(exp.Name,"O","HTML"),!
}
}
}
DHC-APP> d ##class(PHA.TEST.SpecialVariables).NAMESPACE()
方法之前: DHC-APP
方法中的命名空间已更改: DOCBOOK
方法之后: DHC-APP
DHC-APP> d ##class(PHA.TEST.SpecialVariables).NAMESPACE()
方法之前: DHC-APP
方法中的命名空间已更改: DOCBOOK
方法错误后的命名空间: DHC-APP
系统异常: <DIVIDE>
退出例程或分支到错误陷阱将还原到此堆叠的名称空间。在下面的终端示例中显示:
DHC-APP>NEW $NAMESPACE
DHC-APP 1S1>SET $NAMESPACE="SAMPLES"
SAMPLES 1S1>SET myoref=##class(%SQL.Statement).%New()
SAMPLES 1S1>QUIT
/* QUIT恢复为USER名称空间 */
DHC-APP>
示例
下面的示例调用一个例程,该例程在与调用程序不同的名称空间中执行。它使用NEW $NAMESPACE
来堆叠当前名称空间。然后,它使用SET $NAMESPACE
在测试期间更改名称空间。 QUIT
恢复为堆叠的名称空间:
/// d ##class(PHA.TEST.SpecialVariables).NAMESPACE1()
ClassMethod NAMESPACE1()
{
WRITE "前: ",$NAMESPACE,!
DO Test
WRITE "后: ",$NAMESPACE,!
QUIT
Test
NEW $NAMESPACE
SET $NAMESPACE="USER"
WRITE "测试: ",$NAMESPACE,!
QUIT
}
无需处理错误即可切换回旧名称空间。当离开当前堆栈级别时,Caché会还原旧的名称空间。
下面的示例与上一个示例不同,它省略了NEW $NAMESPACE
。请注意,退出QUIT
时,名称空间不会还原:
/// d ##class(PHA.TEST.SpecialVariables).NAMESPACE2()
ClassMethod NAMESPACE2()
{
WRITE "前: ",$NAMESPACE,!
DO Test
WRITE "后: ",$NAMESPACE,!
QUIT
Test
NEW
SET $NAMESPACE="USER"
WRITE "测试: ",$NAMESPACE,!
QUIT
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).NAMESPACE2()
前: DHC-APP
测试: USER
后: USER
临时更改当前名称空间时,调用单独的例程是首选的编程习惯。在无法调用单独例程的情况下,可以使用旧版DO
命令点语法。下面的示例通过使用此DO
命令语法创建堆栈框架来临时更改大型子例程中的名称空间:
/// d ##class(PHA.TEST.SpecialVariables).NAMESPACE3()
ClassMethod NAMESPACE3()
{
WRITE "前: ",$NAMESPACE,!
DO
. NEW $NAMESPACE
. SET $NAMESPACE="USER"
. WRITE "测试: ",$NAMESPACE,!
WRITE "后: ",$NAMESPACE,!
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).NAMESPACE3()
前: DHC-APP
测试: USER
后: DHC-APP
网友评论