执行指定的命令行。
大纲$XECUTE(code,paramlist)
参数
- code 该表达式可解析为有效的ObjectScript命令行,指定为带引号的字符串。命令行可以包含一个或多个ObjectScript命令。最终命令必须为带参数的
QUIT
。 - paramlist 可选-传递给代码的参数列表。多个参数用逗号分隔。
$XECUTE
函数使可以将用户编写的代码作为函数执行,提供传递的参数并返回值。 code参数必须计算为包含一个或多个ObjectScript命令的带引号的字符串。代码执行必须以返回参数的QUIT
命令结束。然后,Caché返回此QUIT参数作为$XECUTE
返回代码值。
可以使用paramlist参数将参数传递给代码。如果要传递参数,则在代码开头必须有一个正式的参数列表。参数在位置上指定。代码中列出的形式参数必须至少与paramlist中指定的实际参数一样多。
可以使用%Library.Routine
类的CheckSyntax()
方法对代码执行语法检查。
每次调用$XECUTE
都会在过程的调用堆栈中放置一个新的上下文框架。 $STACK
特殊变量包含调用堆栈上当前上下文帧的数量。
$XECUTE
函数执行与XECUTE
命令基本相同的操作,但有以下区别:$XECUTE
函数不支持后置条件或使用多个命令行参数。 $XECUTE
函数要求每个执行路径都以自变量QUIT
结尾; XECUTE
命令既不需要QUIT
,也不允许自变量QUIT
。
code
该表达式的计算结果为有效的ObjectScript命令行,指定为带引号的字符串。代码字符串开头不得包含制表符,结尾不得包含。该字符串不能超过有效的ObjectScript程序行。该代码字符串必须包含一个QUIT
命令,该命令在每个可能的执行路径的结尾处返回一个参数。
如果$XECUTE
将参数传递给代码,则代码字符串必须以正式的参数列表开头。形式参数列表放在括号中;在括号内,参数用逗号分隔。
paramlist
传递给代码的参数列表,指定为以逗号分隔的列表。参数列表中的每个参数必须与代码字符串中的形式参数相对应。参数列表中的参数数量可以小于或等于代码中列出的形式参数的数量。
可以使用点前缀来通过引用传递参数。这对于从代码中传递值很有用。下面提供一个示例。
示例在以下示例中,$XECUTE
函数执行在cmdline中指定的命令行。它将两个参数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
)将本地变量值从代码传递给调用上下文。
/// 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
内写入$STACK
值,或让$XECUTE
调用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