zl程序教程

您现在的位置是:首页 >  其它

当前栏目

第七十五章 Caché 函数大全 $XECUTE 函数

函数 大全 Cach 第七
2023-09-11 14:15:37 时间

文章目录

第七十五章 Caché 函数大全 $XECUTE 函数

执行指定的命令行。

大纲

$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