技术文档:Caché命令详解——SET命令

第二十三章 Caché 命令大全 SET 命令

为变量赋值。

重点

  1. 单次调用set(a,b,c,...)=value可以执行的最大赋值数量是128。超过此数字会导致<SYNTAX>错误
  2. 符串值用引号引起来。除了字符串内的双引号被转换为单引号外,字符串的赋值不变。空字符串(“”)是有效值。
  3. 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数字00.00.40.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支持以下特殊值:truefalsenull。这些是字面值,必须用小写字母指定为不带引号的文字。这些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()
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空