1. 程式人生 > 其它 >第十章 Caché 變數大全 $NAMESPACE 變數

第十章 Caché 變數大全 $NAMESPACE 變數

技術標籤:Caché 變數大全CachéCachenamespace系統變數名稱空間

文章目錄

第十章 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