第三十五章 Caché 命令大全 ZNSPACE 命令

第三十五章 Caché 命令大全 ZNSPACE 命令

设置当前命名空间。

重点

  1. 警告:强烈建议不要更改InterSystems提供的系统例程的映射。这样做可能会破坏InterSystems提供的当前或将来的库例程和方法
  2. 强烈建议使用ZNSPACE$NAMESPACE$ZUTIL(5)的现有用法应尽可能淘汰。
  3. 与其他命令相比,更改名称空间需要相对较高的计算能力;如果可能,应用程序代码应避免使用它。

大纲

ZNSPACE:pc nspace
ZN:pc nspace

参数

  • pc - 可选-后置条件表达式。
  • nspace 计算结果为现有命名空间名称的字符串表达式。

描述

ZNSPACE nspace将当前名称空间更改为nspace值。Nspace可以是显式名称空间名称,也可以是隐含的名称空间。

如果nspace不存在,系统将生成<Namespace>错误。如果没有名称空间的访问权限,系统将生成一个<PROTECT>错误,后跟数据库路径。例如,%Developer角色没有访问%SYS命名空间的权限。如果具有此角色并尝试访问此命名空间,则Caché会发出以下错误(在Windows系统上):<PROTECT> *c:\intersystems\cache\mgr\.

可以使用ZNSPACE命令、%cd实用程序(DO^%cd)或通过设置$NAMESPACE$ZNSPACE特殊变量来更改当前名称空间。最好使用ZNSPACE%cd,因为它们可以提供更广泛的错误检查。

临时更改当前名称空间,执行一些操作,然后恢复到以前的名称空间时,可以使用set $NAMESPACE。因为$NAMESPACE允许新建$NAMESPACE,所以当子例程完成或发生意外错误时,它将恢复为原始名称空间。

使用ZNSPACE时,以下方法可能会对有所帮助:

  • 要返回当前命名空间的名称:返回$NAMESPACE$ZNSPACE特殊变量值,或调用%SYSTEM.SYS类的NAMESPACE()方法,如下所示:
   WRITE $SYSTEM.SYS.NameSpace()
DHC-APP>  WRITE $SYSTEM.SYS.NameSpace()
DHC-APP
  • 要列出当前进程可用的所有命名空间(显式和隐式):调用%SYS.Namespace类的ListAll()方法,如下所示:
DHC-APP> DO ##class(%SYS.Namespace).ListAll(.result)
 
DHC-APP>zw result
result("%SYS")=""
result("DHC-APP")=""
result("DHC-CHSSWEB")=""
result("DHC-CSM")=""
result("DHC-DATA")=""
result("DHC-DWR")=""
result("DHC-EKG")=""
result("DHC-HEIS")=""
result("DHC-HR")=""
result("DHC-LISDATA")=""
result("DHC-LISSRC")=""
result("DHC-MEDSRC")=""
result("DHC-MRQ")=""
result("DOCBOOK")=""
result("FDBMS")=""
result("PACS")=""
result("PIS")=""
result("RIS")=""
result("SAMPLES")=""
result("USER")=""

ListAll()列出隐含的名称空间时,它使用脱字符(^)分隔符分隔系统名称。

/// d ##class(PHA.TEST.Command).TestZnspace()
ClassMethod TestZnspace()
{
    SET ListRemote=1
    SET stmt=##class(%SQL.Statement).%New()
    SET status=stmt.%PrepareClassQuery("%SYS.Namespace","List")
    IF status'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(status) QUIT}
    SET rset= stmt.%Execute(ListRemote)
    DO rset.%Display()
}

DHC-APP>d ##class(PHA.TEST.Command).TestZnspace()
 
 
Dumping result #1
Nsp     Status  Remote
%SYS    1       0
DHC-APP 1       0
DHC-CHSSWEB     1       0
DHC-CSM 1       0
DHC-DATA        1       0
DHC-DWR 1       0
DHC-EKG 1       0
DHC-HEIS        1       0
DHC-HR  1       0
DHC-LISDATA     1       0
DHC-LISSRC      1       0
DHC-MEDSRC      1       0
DHC-MRQ 1       0
DOCBOOK 1       0
FDBMS   1       0
PACS    1       0
PIS     1       0
RIS     1       0
SAMPLES 1       0
USER    1       0
 
20 Rows(s) Affected

此查询返回每个命名空间名称、其状态(可用或不可用)以及它是否映射到远程系统。

请注意,这两个清单都列出了所有名称空间,包括用户没有访问权限的名称空间。

  • 要测试是否定义了命名空间:使用%SYS.Namespace类的Existes()方法,如下所示:
DHC-APP>WRITE ##class(%SYS.Namespace).Exists("USER"),!
1
 
DHC-APP>WRITE ##class(%SYS.Namespace).Exists("LOSER")
0

对于UNIX®系统,系统范围内的默认命名空间是作为系统配置选项建立的。对于Windows系统,它是使用命令行启动选项设置的。

更改当前命名空间

可以使用ZNSPACE命令、%cd实用程序(DO^%cd)或通过设置$NAMESPACE$ZNSPACE特殊变量来更改当前名称空间。在终端提示符下,最好使用ZNSPACE%CD,因为它们可以提供更广泛的错误检查。

临时更改当前命名空间时,执行一些操作,然后恢复到以前的命名空间,使用新的$NAMESPACE,然后设置$NAMESPACE。通过使用new $NAMESPACESET $NAMESPACE,您可以建立一个名称空间上下文,当例程结束或发生意外错误时,该上下文将自动恢复到前一个名称空间。

隐含命名名称

隐含的命名空间通过系统名称和目录路径指定命名空间。有三种形式:

  • 当前命名空间的"^^."。这可用于将名称空间提示从显式名称空间更改为相应的隐含名称空间。
  • "^^dir " 指定当前系统上的命名空间目录路径dir。
  • "^system^dir" 指定指定远程系统上的命名空间目录路径目录。

对于目录,请指定目录路径。以下示例显示了这一点:

Windows示例:

  ZNSPACE "^^c:\InterSystems\Cache\mgr\user\"
  WRITE $NAMESPACE
DHC-APP>ZNSPACE "^^c:\InterSystems\Cache\mgr\user\"
...rsystems\cache\mgr\user\>WRITE $NAMESPACE
^^c:\intersystems\cache\mgr\user\

Linux示例:

  ZNSPACE "^RemoteLinuxSystem^/usr/Cache/mgr/user/"
  WRITE $NAMESPACE

若要返回当前命名空间的完整路径名,可以调用NormalizeDirectory()方法,如下例所示:

WRITE ##class(%Library.File).NormalizeDirectory("")
...rsystems\cache\mgr\user\>WRITE ##class(%Library.File).NormalizeDirectory("")
C:\InterSystems\Cache\mgr\user\
DHC-APP>WRITE ##class(%Library.File).NormalizeDirectory("")
E:\DtHealth\db\dthis\data\

参数

pc

可选-可选的后置条件表达式。如果后置条件表达式为TRUE(计算结果为非零数值),则Caché执行该命令。如果后置条件表达式为假(计算结果为零),则Caché不执行该命令。

nspace

计算结果为新命名空间名称的任何有效字符串表达式。Nspace可以是显式名称空间名称,也可以是隐含的名称空间。命名空间名称不区分大小写。Caché始终以全部大写字母显示显式名称空间名称,以全部小写字母显示隐含名称空间名称。

示例

下面的示例使用new$NAMESPACE堆栈当前命名空间。然后,它使用ZNSPACE更改名称空间。退出将恢复为堆叠名称空间:

/// d ##class(PHA.TEST.Command).TestZnspaceSwitch()
ClassMethod TestZnspaceSwitch()
{
   WRITE "before: ",$NAMESPACE,!
   DO Test
   WRITE "after: ",$NAMESPACE,!
   QUIT
Test
   NEW $NAMESPACE
   ZNSPACE "%SYS"
   WRITE "testing: ",$NAMESPACE,!
   QUIT
}
DHC-APP>d ##class(PHA.TEST.Command).TestZnspaceSwitch()
before: DHC-APP
testing: %SYS
after: DHC-APP

下面的示例假定一个名为“accounting”的名称空间已经存在。否则,会收到错误。

USER>ZNSPACE "Accounting"
ACCOUNTING>

默认情况下,如本示例所示,终端提示显示当前名称空间名称。命名空间名称始终以大写字母显示。

下面的示例测试名称空间的存在,然后使用ZNSPACE设置当前名称空间,并使用TerminalPrompt()方法将Terminal终端设置为指定的名称空间或USER

/// d ##class(PHA.TEST.Command).TestZnspaceTerminal()
ClassMethod TestZnspaceTerminal()
{
    WRITE !,"当前名称空间为 ",$NAMESPACE
    SET ns="ACCOUNTING"
    IF 1=##class(%SYS.Namespace).Exists(ns) {
        WRITE !,"将命名空间更改为: ",ns
        ZNSPACE ns
        DO ##class(%SYSTEM.Process).TerminalPrompt(2)
        WRITE !,"and ",$NAMESPACE," 将在终端下显示"
    } ELSE {
        WRITE !,"Namespace ",ns," 不存在"
        SET ns="USER"
        WRITE !,"将命名空间更改为:: ",ns
        ZNSPACE ns
        DO ##class(%SYSTEM.Process).TerminalPrompt(2)
        WRITE !,"and ",$NAMESPACE," 将在终端下显示"
    }
}
DHC-APP>d ##class(PHA.TEST.Command).TestZnspaceTerminal()
 
当前名称空间为 DHC-APP
Namespace ACCOUNTING 不存在
将命名空间更改为:: USER
and USER 将在终端下显示

注意

具有默认目录的命名空间

如果选择的名称空间在远程计算机上具有默认目录,则ZNSPACE不会将进程的当前目录更改为该名称空间的目录。因此,当前的名称空间将成为选择的名称空间,但是当前目录仍然是发出ZNSPACE命令之前的当前目录。

隐式命名空间映射

ZNSPACE从隐式命名空间创建其他默认映射。这些映射与普通(显式)名称空间的映射相同。它们允许进程查找并执行物理上位于CACHESYS和CACHELIB数据库中的%routines%globals( cache\mgr\ 与 cache\mgr\cachelib 目录下).

设置$NAMESPACE$ZNSPACE特殊变量或使用隐式名称空间运行%CD例程与发出ZNSPACE命令相同。

%Routine 映射

当进程使用ZNSPACE命令切换名称空间时,通常会重置系统例程路径映射。普通(显式)名称空间和隐式名称空间都是如此。唯一的例外是当流程从隐式名称空间切换到隐式名称空间时,在这种情况下,将保留现有映射。

可以使用%SYSTEM.Process类的SysRoutinePath()方法覆盖此对系统例程的重新映射。这可以用来覆盖现有的系统例程。通常,它用于调试%routine时创建其他映射。该进程必须对CACHESYS数据库具有“写”权限。使用此方法时应格外小心。

警告:强烈建议不要更改InterSystems提供的系统例程的映射。这样做可能会破坏InterSystems提供的当前或将来的库例程和方法。

%Global 映射

用户首次使用ZNSPACE(或其等效项)进入隐式名称空间时,系统将为该隐式名称空间创建映射,如下所示:Caché首先映射至该隐式名称空间中的现有%globals。然后,Caché将所有其他%globals映射到CACHESYS。

为隐式名称空间创建此映射后,该映射将存储在共享内存中。这意味着,当任何后续用户转到该隐含名称空间时,Caché将使用此预先存在的全局映射。

要更新隐式命名空间全局映射,必须清除此共享内存存储。重新启动系统是清除共享内存的一种方法。

不建议使用的$ZUTIL(5)函数不会从隐式命名空间创建其他默认映射。因此,进程无法找到并执行物理上位于CACHELIB数据库中的%routines和``%Globals。**因此,强烈建议使用ZNSPACENAMESPACE`。 `ZUTIL(5)`的现有用法应尽可能淘汰。**

控制命名空间显示

终端提示

默认情况下,终端提示会显示当前的名称空间名称。此默认值是可配置的:

转到管理门户,选择系统,配置,启动设置。查看和编辑TerminalPrompt的当前设置。这还将设置Telnet窗口的提示。

image.png

若要为当前进程设置此行为,请使用%SYSTEM.Process类的TerminalPrompt()方法。可以通过设置Config.Startup类的TerminalPrompt属性来建立系统范围的默认行为。

终端提示可以将当前名称空间表示为显式名称空间名称或隐式名称空间。如果隐式名称空间路径的长度超过27个字符,则提示会被截断以显示省略号,后跟隐式名称空间路径的最后24个字符。例如: ...rsystems\cache\mgr\user\>

$NAME$QUERY函数

$NAME$QUERY函数可以返回扩展的全局引用形式的全局变量,其中包括名称空间名称。可以控制这些函数是否将名称空间名称作为全局变量名称的一部分返回。可以使用%SYSTEM.Process类的RefInKind()方法为当前进程设置此扩展的全局引用开关。 ese函数将名称空间名称作为全局变量名称的一部分返回。可以通过设置Config.Miscellaneous类的RefInKind属性来建立系统范围的默认行为。

在应用程序代码中更改命名空间

对象和SQL代码假定它在单个名称空间中运行;因此,使用开放对象实例或SQL游标更改名称空间可能导致代码运行不正确。通常,无需显式更改名称空间,因为各种对象,SQL和CSP服务器会自动确保应用程序代码在正确的名称空间中运行。

而且,与其他命令相比,更改名称空间需要相对较高的计算能力;如果可能,应用程序代码应避免使用它。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352