SET assignment-statement 语句
SET赋值语句用于为变量和数组元素赋值。
SET赋值语句调用
此语句可嵌入应用程序中或者以交互方式发出。 如果所有赋值的目标都是全局变量,则可以动态准备一个可执行语句。
SET分配语句授权
特权集所拥有的特权必须包括执行任何表达式所需的特权。
如果指定了行子选择 ,请参阅查询 ,了解每个子选择所需的授权。
如果引用了全局变量或数组全局变量的元素,则权限集必须至少包含以下内容之一:

- 可变读权限
- 可变的所有权
- DATAACCESS 权限
- SYSADM 权限

对于赋值给全局变量或数组元素的全局变量,权限集必须至少包含以下内容之一:

- 可变WRITE权限
- 可变的所有权
- DATAACCESS 权限
- SYSADM 权限

对于过渡变量的赋值,权限集必须至少包含以下内容之一:

- 定义了包含赋值语句的触发器的表或视图的UPDATE权限
- 更新列中与待赋值的过渡变量相对应的列的权限
- 包含赋值语句的触发器所在的表格或视图的所有权
- DBADM 数据库权限,其中包含定义了包含赋值语句的触发器的表
- DATAACCESS 权限
- SYSADM 权限

权限设置:
如果语句嵌入到应用程序中,权限集就是软件包所有者所拥有的权限。 如果语句是动态编写的,则权限集由生效的动态规则行为(运行、绑定、定义或调用)决定,并在动态规则行为和授权检查中进行总结。 有关这些行为的更多信息,包括决定这些行为的 DYNAMICRULES 绑定选项值列表,请参阅授权 ID 和动态 SQL。

SET赋值语句的语法
- 1 仅当相应目标为全局变量或过渡变量时,才必须指定默认值。 如果在高级触发器中为过渡变量指定了默认值,则所有目标变量必须是过渡变量,并且所有源值必须使用DEFAULT关键字指定。
- 2 等号右侧的源值规格(表达式、NULL 或 DEFAULT)的数量必须与语句左侧的目标规格数量一致。
- 3 数组变量名 [数组索引]指数组中的单个元素。
- 4 作为目标变量的 数组变量名是指数组的所有元素。

SET assignment-statement的描述
- 目标变量
- 确定一个或多个目标,为其赋值。 目标数量必须与要分配的值数量相等。
如果语句是在基本触发器中发出的,则每个目标变量都必须是一个过渡变量。
每个目标变量的赋值可以在变量后立即指定。 例如:
variable=expression, variable=expression或者,可以使用括号来指定所有目标变量,然后指定所有值。 例如:
(variable,variable)=(expression,expression)变量列表中每个变量的数据类型必须与其对应的结果列兼容。 根据 " 赋值和比较 "中描述的规则,对目标变量的每次赋值都会在列表中依次进行。
如果目标数量少于结果列的值数量,则将值“W”分配给SQLCA的 SQLWARN3 字段。
如果任何赋值操作出错,则不会将值赋给目标,也不会再向指定目标赋值。 任何已分配的值将保持不变。
- global-variable-name
- 标识作为赋值目标的全球变量。
- 主机变量名
- 标识作为赋值目标的主变量。 对于LOB输出值,目标可以是常规的主变量(如果足够大)、LOB定位变量或LOB文件引用变量。
- SQL参数名称
- 标识作为赋值目标的参数。
- SQL变量名
- 标识作为赋值目标的SQL变量。 SQL变量在使用前必须声明。
- 过渡变量名
- 标识过渡行中要更新的列。 过渡变量名必须标识触发器主表中的列,并且可选地由标识新值的关联名限定。
transition-variable-name 不能对应于 BUSINESS_TIME 周期的开始列或结束列,并且如果语句包含 period-clause 则不能指定。
- 数组变量名
- 指定一个数组变量。 数组变量名作为目标变量 ,指的是数组中的所有元素。
- 表达式
指定要赋值给相应赋值目标的值。 表达式是表达式中描述的任何表达式类型。 在将任何结果分配给目标之前,所有表达式都会经过评估。 如果表达式中涉及赋值目标列表中的变量或数组元素,则表达式中变量或数组元素的值是指在赋值之前的值。对目标的每次赋值都是根据赋值和比较中描述的赋值规则进行的。 当目标变量和表达式采用以下形式时,第一个值将分配给列表中的第一个目标变量,第二个值将分配给列表中的第二个目标变量,以此类推。(target-variable,target-variable,…)=(expression,expression,…)
- NULL
- 指定空值,且只能用于具有关联指示变量的宿主变量。
缺省值
FL 500指定变量的新值为全局变量的初始默认值或与过渡变量相对应的列的默认值。 DEFAULT只能赋给全局变量或过渡变量。 如果在高级触发器中为过渡变量指定了默认值,则所有目标变量必须是过渡变量,并且所有源值必须使用DEFAULT关键字指定。不能将 ROWID 列设置为 DEFAULT 关键字。

- 行子集
- 返回单行的子选择。 列的数量与指定赋值的目标变量数量一致。 每个结果列的值都分配给相应的变量。 如果行子选择的结果为空,则分配空值。 如果结果中有多行,则返回错误。 row-subselect 只能在SQL PL中最外层的子选择中指定。 行子集不能在基本触发器中指定。
- 值
- 指定要分配给相应分配目标的值。 当指定了多个值时,必须用括号括起来。 如前所述,每个值都可以是表达式或NULL。 以下语法是等价的:
- (目标变量 , 目标变量 )=(VALUES (表达式 ,NULL))
- (目标变量 , 目标变量 )= (表达式 ,NULL)
不能指定参数标记。
- 数组变量名 [数组索引 ]
- 指定作为赋值目标的数组元素。
如果语句中也指定了公共表表达式 ,则不能将数组元素指定为赋值的目标。
- 数组变量名
- 指定一个数组变量。
- [数组索引 ]
- 用于指定数组中哪个元素是赋值目标。
对于普通数组,数组索引表达式必须可转换为整数,且不能为空值。 索引值必须在1和数组定义的最大基数之间。
对于关联数组,数组索引表达式必须可转换为关联数组的索引数据类型,且不能为空值。
数组索引不能为:
- 引用当前日期、当前时间或当前时间戳特殊寄存器的表达式
- 非确定性函数
- 由外部动作定义的功能
- 用MODIFIES SQL DATA定义的功能
- 序列表达式
数组元素的赋值必须紧跟在数组元素之后。 例如:
array-variable-name[array-index]=expression
SET分配语句的注释
- 多重任务:
- 如果同一SET语句中包含多个赋值,则在执行赋值之前,所有表达式和行子选择都将被完全计算。 因此,在表达式或行子选择中,目标变量的引用始终是 SET 语句中任何赋值之前的目标变量的值。
- LOBs任务:
- 通常,您使用LOB定位器来分配和检索LOB列中的数据。 然而,由于兼容性规则,您也可以使用LOB定位器将数据分配给具有其他数据类型的目标。 有关定位器的更多信息,请参阅 《使用LOB定位器操作LOB时节省存储空间 》。
- 默认编码方案:
- 数据的默认编码方案是绑定选项ENCODING中的值,该选项用于应用程序编码。 如果此语句与 LENGTH 或 SUBSTRING 等函数一起使用,且这些函数正在对 LOB 定位器进行操作,而定位器指定的 LOB 数据所采用的编码方案与 ENCODING 绑定选项不同,则会发生 LOB 物化和字符转换。 为避免LOB实体化和字符转换,请从 SYSIBM.SYSDUMMYA、 SYSIBM.SYSDUMMYE 或 SYSIBM.SYSDUMMYU 示例表中选取LOB数据。
SET赋值语句示例
SET :HVL = CURRENT PATH; SET :SERVER = CURRENT PATH,
:XTIME = CURRENT TIME,
:MEM = CURRENT MEMBER; SET :DETAILS = SUBSTR(:LOCATOR,1,35); SELECT SUBSTR(:LOCATOR,1,35)
INTO :DETAILS
FROM SYSIBM.SYSDUMMYU; SET (:HV1:IND1, :HV2) =
(CALC_SALARY(:HV3, :HF4), CURRENT PATH); SET (SALARY, COMMISSION) = (50000, 8000); SET NEWROW.COMMISSION = 1.1 * OLDROW.COMMISSION;SET CANADACAPITALS['British Columbia'] = 'Victoria';
SET CANADACAPITALS['Alberta'] = 'Edmonton';
SET CANADACAPITALS['Manitoba'] = 'Winnipeg';
SET CANADACAPITALS['Ontario'] = 'Toronto';
SET CANADACAPITALS['Nova Scotia'] = 'Halifax';在CANADACAPITALS数组中,数组索引值是省份名称,相关数组元素值是相应省会城市的名称。 对关联数组元素指定值时使用的顺序无关紧要。 关联数组的元素按关联数组索引值的升序存储在数组中。
SET CANADACAPITALSA['British Columbia'] = 'Victoria';
SET CANADACAPITALSA['Alberta'] = 'Edmonton';
SET CANADACAPITALSA['Manitoba'] = 'Winnipeg';
SET CANADACAPITALSA['Ontario'] = 'Toronto';
SET CANADACAPITALSA['Nova Scotia'] = 'Halifax';使用单个SET 赋值语句将CANADACAPITALSA中的所有值赋值给CANADACAPITALSB。
SET CANADACAPITALSB = CANADACAPITALSA;SET P_PHONENUMBERS = ARRAY[9055553907, 4165554213, 4085553678];SET P_PHONENUMBERS =
ARRAY [SELECT NUMBER
FROM PHONENUMBERS
WHERE EMPID = 624];SET P_PHONENUMBERS[1] = P_MYNUMBER;
SET P_PHONENUMBERS[10] = P_MYNUMBER;
