第十章 Caché 變數大全 $NAMESPACE 變數
技術標籤:Caché 變數大全CachéCachenamespace系統變數名稱空間
文章目錄
第十章 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