美文网首页
第十章 Caché 变量大全 $NAMESPACE 变量

第十章 Caché 变量大全 $NAMESPACE 变量

作者: Cache技术分享 | 来源:发表于2021-01-22 06:53 被阅读0次

    第十章 Caché 变量大全 $NAMESPACE 变量

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

    大纲

    $NAMESPACE
    SET $NAMESPACE=namespace
    NEW $NAMESPACE
    

    参数

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

    描述

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

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

    返回当前命名空间名称

    $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 $ZNSPACEZNSPACE命令。这是因为$NAMESPACE允许使用NEW $NAMESPACE

    NEW $NAMESPACE

    通过设置$NAMESPACE,可以更改当前名称空间。这是在方法或其他例程中更改名称空间的首选方法。通过使用NEW $NAMESPACESET $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
    系统异常: &lt;DIVIDE&gt;
    

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

    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
    

    相关文章

      网友评论

          本文标题:第十章 Caché 变量大全 $NAMESPACE 变量

          本文链接:https://www.haomeiwen.com/subject/cpajzktx.html