第二十三章 Caché 命令大全 SET 命令
为变量赋值。
重点
- 单次调用
set(a,b,c,...)=value
可以执行的最大赋值数量是128。超过此数字会导致<SYNTAX>
错误 - 符串值用引号引起来。除了字符串内的双引号被转换为单引号外,字符串的赋值不变。空字符串(
“”
)是有效值。 -
SET
接受任意长度的变量名,但在为其赋值之前,它会将长变量名截断为31个字符。
大纲
SET:pc setargument,...
S:pc setargument,...
setargument可以是:
variable=value
(variable-list)=value
参数
- pc 可选-后置条件表达式。
- variable 要设置为相应值的变量。变量可以是局部变量,进程专用全局变量,全局变量,对象属性或特殊变量。(并非所有特殊变量都可以由应用程序设置。)
- variable-list 逗号分隔的列表,用括号括起来,由一个或多个变量参数组成。变量列表中的所有变量参数都分配有相同的值。
- value 文字值或计算结果为值的任何有效ObjectScript表达式。可以是JSON对象或JSON数组。
描述
SET
命令将值分配给变量。它可以设置单个变量,也可以使用两种语法形式的任意组合设置多个变量。它可以通过指定变量=值对的逗号分隔列表来为变量分配值。例如:
SET a=1,b=2,c=3
WRITE a,b,c
通过单次调用set a=value、b=value、c=value、...
,可以执行的赋值次数没有限制。
如果指定的变量不存在,则SET
会创建该变量并赋值。如果存在指定的变量,则SET
将用指定的值替换先前的值。由于SET
按从左到右的顺序执行,因此可以为一个变量赋值,然后将该变量赋值给另一个变量:
SET a=1,b=a
WRITE a,b
DHC-APP>SET a=1,b=a
DHC-APP>WRITE a,b
11
DHC-APP>
值可以是字符串、数字、JSON对象、JSON数组或计算结果为这些值之一的表达式。要定义“空”
变量,可以将该变量设置为空字符串(“”
)值。
将多个变量设置为相同的值
可以使用SET
将相同的值赋给多个变量,方法是指定用圆括号括起来的变量列表(以逗号分隔)。例如:
SET (a,b,c)=1
WRITE a,b,c
DHC-APP>SET (a,b,c)=1
DHC-APP> WRITE a,b,c
111
DHC-APP>
可以将这两种集合的句法形式以任意组合形式组合在一起。例如:
SET (a,b)=1,c=2,(d,e,f)=3
WRITE a,b,c,d,e,f
DHC-APP> SET (a,b)=1,c=2,(d,e,f)=3
DHC-APP> WRITE a,b,c,d,e,f
112333
DHC-APP>
单次调用set(a,b,c,...)=value
可以执行的最大赋值数量是128。超过此数字会导致<SYNTAX>
错误。
设置多个变量的限制
-
$LIST
:不能使用SET(a,b,c,...)=VALUE
语法为等号左侧的$LIST
函数赋值。尝试这样做会导致<SYNTAX>
错误。必须使用set a=value,$list(mylist,n)=value,c=value,...
。使用$LIST
设置其中一个项时的语法。 -
$ EXTRACT
和$ PIECE
:如果该函数使用相对偏移,则不能使用SET(a,b,c,...)= value
语法为等号左侧的$ EXTRACT
或$ PIECE
函数分配值句法。在相对偏移语法中,星号表示字符串的结尾,*-n
和* + n
表示距字符串结尾的相对偏移。例如,SET(x,$ PIECE(mylist,“ ^”,3))= 123
是有效的,但是SET(x,$ PIECE(mylist,“ ^”,*))= 123
导致错误。使用相对偏移设置这些功能之一时,必须使用SET a = value,b = value,c = value,...
语法。 - 对象属性:不能使用
SET(a,b,c,...)= value
语法为等号左侧的对象属性分配值。尝试这样做会导致<object Dispatch>
错误,并显示如下消息:MyPackage.MyClass
类的Set
属性MyProp
不是直接引用,并且不能是多个Set Arg
。必须使用set a=value,oref.MyProp=value,c=value,...
。设置对象属性时的语法。
参数
pc
可选的后置条件表达式。如果后置条件表达式为TRUE(计算结果为非零数值),则Caché执行该命令。如果后置条件表达式为假(计算结果为零),则Caché不执行该命令。
variable
用于接收值求值结果的变量。它可以是局部变量、进程私有全局变量、全局变量或特殊变量。局部变量、进程私有全局变量或全局变量既可以是下标变量,也可以是取消下标变量,可以使用扩展的全局引用指定全局变量。
局部变量、进程私有全局变量和特殊变量特定于当前进程;它们被映射为可以从所有名称空间访问。全局变量在创建它的进程终止后仍然存在。
全局变量特定于在其中创建全局变量的命名空间。默认情况下,集在当前名称空间中指定全局。可以使用set
在另一个名称空间中定义全局(^myglobal
),方法如下:SET ^["Samples"]myglobal="Ansel Adams"
。如果指定的名称空间不存在,则Caché会发出<nampace>
错误。如果指定了没有权限的命名空间,则Caché会发出一个错误,后跟全局名称和数据库路径,如下所示:^myglobal,c:\interSystems\cache\mgr\
。
变量可以是$PIECE
或$EXTRACT
函数的参数中指定的一段或一段变量。
可以使用obj.property
或..
将变量表示为对象属性。属性语法,或使用$PROPERTY
函数。可以使用以下语法设置i%Property
实例属性引用:
SET i%propname = "abc"
SET
接受任意长度的变量名,但在为其赋值之前,它会将长变量名截断为31个字符。如果变量名在前31个字符内不是唯一的,此名称截断可能会导致意外覆盖变量值,如下例所示:
/// d ##class(PHA.TEST.Command).TestSet()
ClassMethod TestSet()
{
SET abcdefghijklmnopqrstuvwxyz2abc="30 characters"
SET abcdefghijklmnopqrstuvwxyz2abcd="31 characters"
SET abcdefghijklmnopqrstuvwxyz2abcde="32 characters"
SET abcdefghijklmnopqrstuvwxyz2abcdef="33 characters"
WRITE !,abcdefghijklmnopqrstuvwxyz2abc // returns "30 characters"
WRITE !,abcdefghijklmnopqrstuvwxyz2abcd // returns "33 characters"
WRITE !,abcdefghijklmnopqrstuvwxyz2abcde // returns "33 characters"
WRITE !,abcdefghijklmnopqrstuvwxyz2abcdef // returns "33 characters"
}
DHC-APP>d ##class(PHA.TEST.Command).TestSet()
30 characters
33 characters
33 characters
33 characters
根据定义,特殊变量由系统事件设置。可以使用SET
为某些特殊变量赋值。但是,大多数特殊变量不能使用SET
赋值。
value
文字值或任何有效的CachéObjectScript表达式。通常,值是数字或字符串表达式。值可以是JSON对象或JSON数组。
- 在赋值之前将数值转换为规范形式:删除前导和尾随零、加号或尾随小数点。执行从科学记数法的转换和算术运算的评估。
- 字符串值用引号引起来。除了字符串内的双引号被转换为单引号外,字符串的赋值不变。空字符串(
“”
)是有效值。 - 用引号括起来的数值不会转换为规范形式,并且在赋值之前不会执行任何算术运算。
- 如果使用关系或逻辑表达式,则Caché会指定表达式对齐产生的真值(0或1)。
- 返回值的对象属性和对象方法是有效的表达式。使用相对点语法(
..
)。用于将属性或方法值赋给变量。
JSON值
可以使用set
命令将变量设置为JSON对象或JSON数组。对于JSON对象,该值是由大括号分隔的JSON对象。对于JSON数组,该值是用方括号分隔的JSON数组。
在这些分隔符中,文字值是JSON文字,而不是ObjectScript文字。无效的JSON文本会生成<SYNTAX>
错误。
- 字符串文字:必须用双引号将JSON字符串引起来。要将某些字符指定为JSON字符串中的文字,必须指定
\
转义字符,后跟文字。如果JSON字符串包含双引号文字字符,则此字符写为\“
。JSON字符串语法提供双引号(\\“
)、反斜杠(\\
)和斜杠(\/
)的转义。也可以转义行间字符:退格符(\b
)、换页符(\f
)、换行符(\n
)、回车符(\r
)和制表符(\t
)。任何Unicode字符都可以由六个字符的序列表示:反斜杠、小写字母u和四个十六进制数字。例如,\u0022
指定文字双引号字符;\u03BC
指定希腊文小写字母Mu。 - 数字文字:JSON不会将数字转换为ObjectScript规范形式。JSON有自己的转换和验证规则:只允许使用一个前导减号;不允许使用前导加号;不允许使用多个前导符号。允许使用“
E
”科学记数法字符,但不对其求值。不允许使用前导零;将保留尾随零。小数分隔符的两侧必须有一个数字字符。因此,JSON数字0
、0.0
、0.4
和0.400
是有效的。保留零值上的负号。
对于IEEE浮点数,适用其他规则。
JSON小数的存储格式与ObjectScript数字不同。ObjectScript浮点小数在达到其最大精度时进行四舍五入,并删除尾随零。JSON压缩的BCD小数允许更高的精度,并保留尾随零。下面的示例显示了这一点:
SET jarray=[1.23456789123456789876000,(1.23456789123456789876000)]
WRITE jarray.%ToJSON()
DHC-APP>SET jarray=[1.23456789123456789876000,(1.23456789123456789876000)]
DHC-APP> WRITE jarray.%ToJSON()
[1.23456789123456789876000,1.234567891234567899]
- 特殊值:JSON支持以下特殊值:
true
、false
和null
。这些是字面值,必须用小写字母指定为不带引号的文字。这些JSON特殊值不能使用变量指定,也不能在ObjectScript表达式中指定。 - 对象:若要在JSON数组元素或JSON对象值中包含ObjectScript文本或表达式,必须将整个字符串括在括号中。不能在JSON对象键中指定ObjectScript。ObjectScript和JSON使用不同的转义序列约定。要在ObjectScript中转义双引号字符,请将其加倍。在下面的示例中,在JSON数组中指定了JSON字符串文字和ObjectScript字符串文字:
SET jarray=["This is a \"good\" JSON string",("This is a ""good"" ObjectScript string")]
WRITE jarray.%ToJSON()
DHC-APP> SET jarray=["This is a \"good\" JSON string",("This is a ""good"" ObjectScript string")]
DHC-APP>WRITE jarray.%ToJSON()
["This is a \"good\" JSON string","This is a \"good\" ObjectScript string"]
下面的JSON数组示例指定ObjectScript局部变量并将ObjectScript数值转换为规范形式:
SET str="This is a string"
SET jarray=[(str),(--0007.000)]
WRITE jarray.%ToJSON()
DHC-APP>SET str="This is a string"
DHC-APP>SET jarray=