以下是一些赋值示例:
z = a + b + c; myDate = VGVar.currentShortGregorianDate; myUser = sysVar.userID; myRecord01 = myRecord02; myRecord02 = "USER";
下表以及随后的说明讲述了兼容性规则。
目标基本类型 | 对目标有效的源基本类型(或松散类型) |
---|---|
BIN | BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF, FLOAT, SMALLFLOAT, MONEY |
CHAR | CHAR, DATE, TIME, HEX, MBCHAR, NUM, NUMBER, TIMESTAMP |
DATE | DATE, CHAR, NUM, TIMESTAMP |
DBCHAR | DBCHAR |
DECIMAL | BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF |
FLOAT | BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF, FLOAT, SMALLFLOAT, MONEY |
HEX | CHAR, HEX |
INTERVAL | INTERVAL |
MBCHAR | CHAR, MBCHAR |
MONEY | BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF, FLOAT, SMALLFLOAT |
NUM | BIN, INT, DATE, TIME, BIGINT, SMALLINT, CHAR, NUM, NUMBER, NUMC, PACF, DECIMAL, FLOAT, SMALLFLOAT, MONEY |
NUMC | BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF, FLOAT, SMALLFLOAT |
PACF | BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF |
SMALLFLOAT | BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF, FLOAT, SMALLFLOAT, MONEY |
TIME | TIME, CHAR, NUM, TIMESTAMP |
TIMESTAMP | CHAR, DATE, TIME, TIMESTAMP |
UNICODE | UNICODE |
以下是一种特殊情况:可以将数学系统字返回的数值赋予 HEX 类型的项;有关详细信息,请参阅数学(系统字)。 |
EGL 赋值语句的行为与 move 语句的行为不同,move 语句的行为在另一参考主题中作了描述。
可以将任何数字类型(BIN、DECIMAL、FLOAT、MONEY、NUM、NUMBER、NUMC、PACF 和 SMALLFLOAT)的值赋予具有任何数字类型和大小的项,并且 EGL 执行必需的转换来以目标格式保留数据。
当目标为定点类型(不是 FLOAT 或 SMALLFLOAT)时,必要时将添加或截断无意义的零。(值的整数部分开头的零是无关紧要的,值的小数部分结尾的零也是无关紧要的。)
对于任何数字类型,可以使用系统变量 sysVar.overflowIndicator 来测试赋值或算术计算是否导致了算术溢出,并且可以设置系统变量 VGVar.handleOverflow 来指定此类溢出的后果。
如果发生了算术溢出,则不会更改目标项中的值。如果未发生算术溢出,则根据目标项的声明来调整赋予目标项的值。
对定点类型的项指定浮点值(类型 FLOAT 或 SMALLFLOAT)时,必要时目标值会被截断。如果源值为 108.357 并且定点目标有一个小数位(如目标接收到 108.3),将出现这种情况。
如果类型为 NUM 的值是负数并且被赋予类型为 CHAR 的值,则复制到项中的最后一个字节是不可打印字符。
此运算等同于 NUM 至 NUM 的赋值。
如果类型为 NUMC 的目标的值是负数,则复制到类型为 CHAR 的目标中的最后一个字节是不可打印字符。
// NOT valid because February 30 is not a valid date myTS timestamp("yyyyMMdd"); myTS = "20050230";
// NOT valid if run in February myTS timestamp("dd"); myTS = "30";
在这种情况下,EGL 会按需要截断字符以确保目标项包含类型为 MBCHAR 的有效字符串,然后添加结束单字节空格(如果必要的话)。
sourceTimeStamp timestamp ("MMdd"); targetTimeStamp timestamp ("yyyyMMdd"); sourceTimeStamp = "1201"; // if this code runs in 2004, the next statement // assigns 20041201 to targetTimeStamp targetTimeStamp = sourceTimeStamp;
sourceTimeStamp02 timestamp ("ssff"); targetTimeStamp02 timestamp ("mmssff"); sourceTimeStamp02 = "3201"; // the next assignment includes the minute // that is current when the assignment statement runs targetTimeStamp02 = sourceTimeStamp02;
sourceTimeStamp timestamp ("yyyyMM"); targetTimeStamp timestamp ("yyyyMMdd"); sourceTimeStamp = "200412"; // regardless of the day, the next statement // assigns 20041201 to targetTimeStamp targetTimeStamp = sourceTimeStamp;
sourceTimeStamp02 timestamp ("hh"); targetTimeStamp02 timestamp ("hhmm"); sourceTimeStamp02 = "11"; // regardless of the minute, the next statement // assigns 1100 to targetTimeStamp02 targetTimeStamp02 = sourceTimeStamp02;
可以将具有子结构的项赋予不具有子结构的项,反之亦然,并且可以在两个具有子结构的项之间进行赋值。例如,假定名为 myNum 和 myRecord 的变量基于下列部件:
DataItem myNumPart NUM(12) end Record myRecordPart type basicRecord 10 topMost CHAR(4); 20 next01 HEX(4); 20 next02 HEX(4); end
在数学系统字的外部,将类型为 HEX 的值赋予类型为 NUM 的项无效;但由于 topMost 的类型为 CHA,所以格式为 myNum = topMost 的赋值有效。一般来说,赋值语句中的项的基本类型控制赋值,并且不考虑下级项的基本类型。
缺省情况下,具有子结构的项的基本类型为 CHAR。如果将数据赋予具有子结构的项或从具有子结构的项进行数据赋值,并且在声明时未指定另一基本类型,则先前对类型为 CHA 的项描述的规则在赋值期间生效。
一条记录至另一条记录的赋值等同于将一个类型为 CHAR 的具有子结构的项赋予另一个类型为 CHAR 的具有子结构的项。长度不匹配会导致在接收到的值右边添加单字节空格或从接收到的值右边除去单字节字符。赋值不考虑下级结构项的基本类型。
最后,如果将 SQL 记录赋予具有另一类型的记录或者将具有另一类型的记录赋予 SQL 记录,则必须确保非 SQL 记录有空间来存放每个结构项前面的四字节区域。
相关概念
语法图