前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Caché 变量大全 $NAMESPACE 变量

Caché 变量大全 $NAMESPACE 变量

作者头像
用户7741497
发布2022-05-10 17:43:51
3850
发布2022-05-10 17:43:51
举报
文章被收录于专栏:hml_知识记录

Caché 变量大全 $NAMESPACE 变量

包含当前堆栈级的命名空间。

大纲

代码语言:javascript
复制
$NAMESPACE
SET $NAMESPACE=namespace
NEW $NAMESPACE

参数

  • namespace 现有命名空间的名称,指定为文字引号字符串或解析为引号字符串的表达式。命名空间名称不区分大小写。

描述

$NAMESPACE包含当前堆栈级别的当前命名空间的名称。可以使用$NAMESPACE执行以下操作:

  • 返回当前命名空间的名称。
  • 使用Set更改当前命名空间。
  • 使用newset建立新的临时命名空间上下文。

返回当前命名空间名称

$NAMESPACE特殊变量包含当前名称空间名称。

还可以通过调用%SYSTEM.SYS类的Namespace()方法来获取当前命名空间的名称,如下所示:

代码语言:javascript
复制
DHC-APP>WRITE $SYSTEM.SYS.NameSpace()
DHC-APP

可以使用%Library.File类的NormalizeDirectory()方法获取当前命名空间的完整路径名,如下所示:

代码语言:javascript
复制
DHC-APP>WRITE $NAMESPACE,!
DHC-APP
 
DHC-APP>WRITE ##class(%Library.File).NormalizeDirectory("")
E:\DtHealth\db\dthis\data\

可以使用%SYS.Namespace类的Existes()方法测试命名空间是否已定义,如下所示:

代码语言:javascript
复制
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 $ZNSPACEZNSPACE命令。这是因为$NAMESPACE允许使用NEW $NAMESPACE

NEW $NAMESPACE

通过设置$NAMESPACE,可以更改当前名称空间。这是在方法或其他例程中更改名称空间的首选方法。通过使用NEW $NAMESPACESET $NAMESPACE,可以建立一个命名空间上下文,当方法结束或发生意外错误时,它会自动恢复为先前的命名空间:

代码语言:javascript
复制
/// 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"),! 
        }
    }
}
代码语言:javascript
复制
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
系统异常: &lt;DIVIDE&gt;

退出例程或分支到错误陷阱将还原到此堆叠的名称空间。在下面的终端示例中显示:

代码语言:javascript
复制
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恢复为堆叠的名称空间:

代码语言:javascript
复制
/// 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时,名称空间不会还原:

代码语言:javascript
复制
/// d ##class(PHA.TEST.SpecialVariables).NAMESPACE2()
ClassMethod NAMESPACE2()
{
    WRITE "前: ",$NAMESPACE,!
    DO Test
    WRITE "后: ",$NAMESPACE,!
    QUIT
Test
    NEW
    SET $NAMESPACE="USER"
    WRITE "测试: ",$NAMESPACE,!
    QUIT
}
代码语言:javascript
复制
DHC-APP>d ##class(PHA.TEST.SpecialVariables).NAMESPACE2()
前: DHC-APP
测试: USER
后: USER

临时更改当前名称空间时,调用单独的例程是首选的编程习惯。在无法调用单独例程的情况下,可以使用旧版DO命令点语法。下面的示例通过使用此DO命令语法创建堆栈框架来临时更改大型子例程中的名称空间:

代码语言:javascript
复制
/// d ##class(PHA.TEST.SpecialVariables).NAMESPACE3()
ClassMethod NAMESPACE3()
{
    WRITE "前: ",$NAMESPACE,!
    DO
    . NEW $NAMESPACE
    . SET $NAMESPACE="USER"
    . WRITE "测试: ",$NAMESPACE,!
    WRITE "后: ",$NAMESPACE,!
}
代码语言:javascript
复制
DHC-APP>d ##class(PHA.TEST.SpecialVariables).NAMESPACE3()
前: DHC-APP
测试: USER
后: DHC-APP

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Caché 变量大全 $NAMESPACE 变量
  • 大纲
  • 参数
  • 描述
    • 返回当前命名空间名称
      • SET $NAMESPACE
        • NEW $NAMESPACE
        • 示例
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档