第七十五章 Caché 函數(shù)大全 $XECUTE 函數(shù)
執(zhí)行指定的命令行。
大綱
$XECUTE(code,paramlist)
參數(shù)
- code 該表達(dá)式可解析為有效的ObjectScript命令行,指定為帶引號的字符串。命令行可以包含一個(gè)或多個(gè)ObjectScript命令。最終命令必須為帶參數(shù)的
QUIT。 - paramlist 可選-傳遞給代碼的參數(shù)列表。多個(gè)參數(shù)用逗號分隔。
描述
$XECUTE函數(shù)使可以將用戶編寫的代碼作為函數(shù)執(zhí)行,提供傳遞的參數(shù)并返回值。 code參數(shù)必須計(jì)算為包含一個(gè)或多個(gè)ObjectScript命令的帶引號的字符串。代碼執(zhí)行必須以返回參數(shù)的QUIT命令結(jié)束。然后,Caché返回此QUIT參數(shù)作為$XECUTE返回代碼值。
可以使用paramlist參數(shù)將參數(shù)傳遞給代碼。如果要傳遞參數(shù),則在代碼開頭必須有一個(gè)正式的參數(shù)列表。參數(shù)在位置上指定。代碼中列出的形式參數(shù)必須至少與paramlist中指定的實(shí)際參數(shù)一樣多。
可以使用%Library.Routine類的CheckSyntax()方法對代碼執(zhí)行語法檢查。
每次調(diào)用$XECUTE都會在過程的調(diào)用堆棧中放置一個(gè)新的上下文框架。 $STACK特殊變量包含調(diào)用堆棧上當(dāng)前上下文幀的數(shù)量。
$XECUTE函數(shù)執(zhí)行與XECUTE命令基本相同的操作,但有以下區(qū)別:$XECUTE函數(shù)不支持后置條件或使用多個(gè)命令行參數(shù)。 $XECUTE函數(shù)要求每個(gè)執(zhí)行路徑都以自變量QUIT結(jié)尾; XECUTE命令既不需要QUIT,也不允許自變量QUIT。
參數(shù)
code
該表達(dá)式的計(jì)算結(jié)果為有效的ObjectScript命令行,指定為帶引號的字符串。代碼字符串開頭不得包含制表符,結(jié)尾不得包含。該字符串不能超過有效的ObjectScript程序行。該代碼字符串必須包含一個(gè)QUIT命令,該命令在每個(gè)可能的執(zhí)行路徑的結(jié)尾處返回一個(gè)參數(shù)。
如果$XECUTE將參數(shù)傳遞給代碼,則代碼字符串必須以正式的參數(shù)列表開頭。形式參數(shù)列表放在括號中;在括號內(nèi),參數(shù)用逗號分隔。
paramlist
傳遞給代碼的參數(shù)列表,指定為以逗號分隔的列表。參數(shù)列表中的每個(gè)參數(shù)必須與代碼字符串中的形式參數(shù)相對應(yīng)。參數(shù)列表中的參數(shù)數(shù)量可以小于或等于代碼中列出的形式參數(shù)的數(shù)量。
可以使用點(diǎn)前綴來通過引用傳遞參數(shù)。這對于從代碼中傳遞值很有用。下面提供一個(gè)示例。
示例
在以下示例中,$XECUTE函數(shù)執(zhí)行在cmdline中指定的命令行。它將兩個(gè)參數(shù)num1和num2傳遞到此命令行。
/// d ##class(PHA.TEST.Function).XECUTE(99,0)
ClassMethod XECUTE(num1, num2)
{
SET cmd="(dvnd,dvsr) IF dvsr=0 {QUIT 99} ELSE {SET ^testnum=dvnd/dvsr QUIT 0}"
SET rtn=$XECUTE(cmd,num1,num2)
IF rtn=99
{WRITE !,"Division by zero. ^testnum not set"}
ELSE
{WRITE !,"global ^testnum set to",^testnum}
}
DHC-APP>d ##class(PHA.TEST.Function).XECUTE(99,0)
Division by zero. ^testnum not set
DHC-APP>d ##class(PHA.TEST.Function).XECUTE(1,2)
global ^testnum set to.5
下面的示例使用按引用傳遞(.y)將本地變量值從代碼傳遞給調(diào)用上下文。
/// d ##class(PHA.TEST.Function).XECUTE1()
ClassMethod XECUTE1()
{
SET x=7
SET rtn=$XECUTE("(in,out) SET out=in*in*in QUIT 0",x,.y)
IF rtn=0 {WRITE !,x," cubed is ",y}
ELSE {WRITE !,"Error code=",SQLCODE}
}
DHC-APP>d ##class(PHA.TEST.Function).XECUTE1()
7 cubed is 343
下面的示例顯示$XECUTE如何增加$STACK特殊變量。此示例從$XECUTE內(nèi)寫入$STACK值,或讓$XECUTE調(diào)用XECUTE命令,該命令將寫入$STACK值:
StackIt
SET stackit=$RANDOM(3)
IF stackit=0 {GOTO StackIt}
WRITE "initial stack level ",$STACK,!
SET cmd="(stackit) IF stackit=1 {WRITE ""stack is "",$STACK,! QUIT 1} "_
"ELSEIF stackit=2 {WRITE ""stack is "",$STACK XECUTE ""WRITE """" stack is """",$STACK,!"" QUIT 1} "_
"ELSE { QUIT 0}"
SET rtn=$XECUTE(cmd,stackit)
IF rtn=1 { WRITE "return stack level ",$STACK }
ELSE {WRITE "unexpected value: rtn=",rtn}
DHC-APP>d StackIt^PHA.TEST.Command
initial stack level 1
stack is 2
return stack level 1
DHC-APP>d StackIt^PHA.TEST.Command
initial stack level 1
stack is 2 stack is 3
return stack level 1