赋值

EGL 赋值可以起到下列作用:

赋值语句的语法图
target
项、记录或系统变量
source
表达式或记录。表达式可以由复杂的符号序列组成(例如,a + b + c),也可以是下列其中一项:
  • 项或系统变量
  • 函数调用
  • 文字
缺省情况下,记录等同于类型为 CHAR 的项,并且总字节数等于结构项中的字节总数。当记录具有 CHAR 类型时,会有下列例外情况:

以下是一些赋值示例:

  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 来指定此类溢出的后果。

如果发生了算术溢出,则不会更改目标项中的值。如果未发生算术溢出,则根据目标项的声明来调整赋予目标项的值。

假定正在将类型为 NUM 的项复制至另一个项并且源项的运行时值为 108.314:
  • 如果目标项允许七位数并且有一位为小数,则目标项接收到值 000108.3,且不会检测到数字溢出。(不会将小数值中的精度丢失认为是溢出。)
  • 如果目标项允许四位数并且有两位为小数,则会检测到数字溢出且不会更改目标项中的值

对定点类型的项指定浮点值(类型 FLOAT 或 SMALLFLOAT)时,必要时目标值会被截断。如果源值为 108.357 并且定点目标有一个小数位(如目标接收到 108.3),将出现这种情况。

其它交叉类型赋值

有关其它交叉类型赋值的详细信息如下所示:
  • 仅当源声明未包含小数位时,将类型为 NUM 的值赋予类型为 CHAR 的目标才有效。此运算等同于 CHAR 至 CHAR 的赋值。
    例如,如果源长度为 4 并且值为 21,则其内容等同于“0021”,并且长度不匹配不会导致错误状态:
    • 如果目标的长度为 5,则该值是作为“0021 ”(在右边添加了一个单字节空格)存储的
    • 如果目标的长度为 3,则该值是作为“002”(在右边截断了一位)存储的

    如果类型为 NUM 的值是负数并且被赋予类型为 CHAR 的值,则复制到项中的最后一个字节是不可打印字符。

  • 仅在下列情况下,将类型为 CHAR 的值赋予类型为 NUM 的目标才有效:
    • 源(项或字符串表达式)包含数字,并且未包含其它字符
    • 目标声明没有小数位

    此运算等同于 NUM 至 NUM 的赋值。

    例如,如果源长度为 4 并且值为“0021”,则内容等同于数字 21,下列示例显示了长度不匹配的结果:
    • 如果目标的长度为 5,则该值是作为 00021(在左边填充了数字零)存储的
    • 如果目标的长度为 3,则该值是作为 021(截断了无关紧要的位)存储的
    • 如果目标的长度为 1,则该值将存储为 1
  • 可以通过两个步骤来完成从类型为 NUMC 的值到类型为 CHAR 的目标的赋值,如果值为正数,则会除去符号:
    1. 将 NUMC 值赋予类型为 NUM 的目标
    2. 将 NUM 值赋予类型为 CHAR 的目标

    如果类型为 NUMC 的目标的值是负数,则复制到类型为 CHAR 的目标中的最后一个字节是不可打印字符。

  • 仅当源中的字符位于十六进制数字(0-9、A-F 和 a-f)范围内时,将类型为 CHAR 的值赋予类型为HEX 的目标才有效。
  • 将类型为 HEX 的值赋予类型为 CHAR 的目标会将数字和大写字母(A-F)存储在目标中。
  • 将类型为 MONEY 的值赋予类型为 CHAR 的目标是无效的。将 MONEY 转换为 CHAR 的最好办法是使用系统函数 formatNumber。
  • 仅当源值是符合掩码 yyyyMMdd 的有效日期时,将类型为 NUM 或 CHAR 的值赋予类型为 DATE 的目标才有效,有关详细信息,请参阅主题 DATE
  • 仅当源值是符合掩码 hhmmss 的有效时间时,将类型为 NUM 或 CHAR 的值赋予类型为 TIME 的目标才有效,有关详细信息,请参阅主题 TIME
  • 仅当源值是符合 TIMESTAMP 项的掩码的有效时间戳记时,将类型为 CHAR 的值赋予类型为 TIMESTAMP 的目标才有效。以下是一个示例:
       // NOT valid because February 30 is not a valid date
       myTS timestamp("yyyyMMdd"); 
       myTS = "20050230";
    如果完整掩码的开头缺少字符(例如,如果掩码为“dd”),则 EGL 假定高级字符(在此情况下为“yyyyMM”)表示当前时刻以符合机器时钟。下列语句导致二月份出现运行时错误:
       // NOT valid if run in February
       myTS timestamp("dd"); 
       myTS = "30";
  • 将类型为 TIME 或 DATE 的值赋予类型为 NUM 的目标相当于将类型为 NUM 的值赋予类型为 NUM 的目标。
  • 将类型为 TIME、DATE 或 TIMESTAMP 的值赋予类型为 CHAR 的目标相当于将类型为 CHAR 的值赋予类型为 CHAR 的目标。

字符类型的填充和截断

如果目标具有字符类型(CHAR、DBCHAR、HEX、MBCHAR 和 UNICODE),并具有多于存储源值所需的空间,则 EGL 会在右边填充数据:
  • 使用单字节空格来填充类型为 CHAR 或 MBCHAR 的目标
  • 使用双字节空格来填充类型为 DBCHAR 的目标
  • 使用 Unicode 双字节空格来填充类型为 UNICODE 的目标
  • 使用二进制零来填充类型为 HEX 的目标,例如,这表示源值“0A”在双字节目标中将存储为“0A00”而不是存储为“000A”
如果字符类型的目标空间不足以存储源值,则 EGL 会截断右边的值。不会发出错误信号。下列情形下可能会发生特殊情况:
  • 运行时平台支持 EBCDIC 字符集
  • 赋值语句将类型为 MBCHAR 的文字或类型为 MBCHAR 的项复制至类型为 MBCHAR 的较短项
  • 逐字节截断将会除去最后的 Shift-in 字符或分割 DBCHAR 字符

在这种情况下,EGL 会按需要截断字符以确保目标项包含类型为 MBCHAR 的有效字符串,然后添加结束单字节空格(如果必要的话)。

时间戳记之间的赋值

如果将类型为 TIMESTAMP 的项赋予另一个类型为 TIMESTAMP 的项,则下列规则适用:
  • 如果源项的掩码缺少目标项所需的相对高级的条目,将在赋值时根据机器上的时钟指定这些目标条目,如下列示例所示:
    •   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;

赋值给具有子结构的项或从具有子结构的项进行赋值

可以将具有子结构的项赋予不具有子结构的项,反之亦然,并且可以在两个具有子结构的项之间进行赋值。例如,假定名为 myNummyRecord 的变量基于下列部件:

  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 的具有子结构的项。长度不匹配会导致在接收到的值右边添加单字节空格或从接收到的值右边除去单字节字符。赋值不考虑下级结构项的基本类型。

正如前面所提到的,存在下列例外情况:
  • 可以将记录的内容赋予记录,或赋予类型为 CHAR、HEX 或 MBCHAR 的项,但是不能赋予任何其它类型的项
  • 记录可以从记录中、从字符串文字中或从 CHAR、HEX 或 MBCHAR 类型的项中接收数据,但是不能从数字文字中或从除 CHAR、HEX 或 MBCHAR 以外的类型的项中接收数据

最后,如果将 SQL 记录赋予具有另一类型的记录或者将具有另一类型的记录赋予 SQL 记录,则必须确保非 SQL 记录有空间来存放每个结构项前面的四字节区域。

相关概念
语法图

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.