SET assignment-statement 语句

SET赋值语句用于为变量和数组元素赋值。

SET赋值语句调用

此语句可嵌入应用程序中或者以交互方式发出。 如果所有赋值的目标都是全局变量,则可以动态准备一个可执行语句。

SET分配语句授权

特权集所拥有的特权必须包括执行任何表达式所需的特权。

更改开始如果指定了行子选择 ,请参阅查询 ,了解每个子选择所需的授权。更改结束

更改开始如果引用了全局变量或数组全局变量的元素,则权限集必须至少包含以下内容之一:更改结束

更改开始
  • 可变读权限
  • 可变的所有权
  • DATAACCESS 权限
  • SYSADM 权限
更改结束

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

更改开始
  • 可变WRITE权限
  • 可变的所有权
  • DATAACCESS 权限
  • SYSADM 权限
更改结束

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

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

权限设置:

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

更改开始

SET赋值语句的语法

阅读语法图跳过可视化语法图SETassignment-clause
assignment-clause
阅读语法图跳过可视化语法图,目标变量=表达式NULLDEFAULT1(,目标变量)=(,表达式NULLDEFAULT12行子集VALUES表达式NULLDEFAULT1(,表达式NULLDEFAULT1))数组变量名[ 数组索引]3=表达式NULL
目标变量
阅读语法图跳过可视化语法图全局变量名主机变量名SQL参数名称SQL变量名过渡变量名数组变量名4
注意:
  • 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赋值语句示例

示例1 :将主机变量HVL设置为特殊寄存器CURRENT PATH的值。
   SET :HVL = CURRENT PATH;
示例2: 将主机变量PATH设置为SQL PATH特殊寄存器的内容,将主机变量XTIME设置为当前服务器的本地时间,将主机变量MEM设置为数据共享环境的当前成员。
   SET :SERVER = CURRENT PATH,
       :XTIME = CURRENT TIME,
       :MEM = CURRENT MEMBER;
示例 3: 使用 LOB 表达式和 LOB 定位符来引用提取的值部分,将宿主变量 DETAILS 设置为 LOB 值的一部分。
   SET :DETAILS = SUBSTR(:LOCATOR,1,35);
如果 LOB 定位器 LOCATOR 指定的 LOB 数据与 ENCODING 绑定选项的值采用不同的编码方案,并且您希望避免 LOB 实体化和字符转换,请使用以下语句代替 SET 语句:
   SELECT SUBSTR(:LOCATOR,1,35)
      INTO :DETAILS
      FROM SYSIBM.SYSDUMMYU;
示例4: 将主机变量 HV1 设置为外部函数CALC_SALARY的结果,将主机变量 HV2 设置为特殊寄存器CURRENT PATH的值。 如果CALC_SALARY返回空值,请使用 HV1 的指示值。
   SET (:HV1:IND1, :HV2) =
       (CALC_SALARY(:HV3, :HF4), CURRENT PATH);
示例5: 假设您想要创建一个前触发器,用于将“员工”表中新插入行的工资和佣金列设置为默认值,并且您将在引用子句中仅使用NEW来定义触发器。 为“工资”和“佣金”列指定默认值。
   SET (SALARY, COMMISSION) = (50000, 8000);
示例 6: 假设您想要创建一个前触发器,用于检测雇员表中更新行的佣金增幅是否超过 10%,并将佣金增幅限制为 10%。 您将在引用子句中使用OLD和NEW来定义触发条件。 将佣金一栏的增幅限制在10%。
   SET NEWROW.COMMISSION = 1.1 * OLDROW.COMMISSION;
例7: 假设关联数组变量CANADACAPITALS的数组类型为CAPITALSARRAY。 使用SET 赋值语句为CANADACAPITALS赋值。
SET CANADACAPITALS['British Columbia'] = 'Victoria';
SET CANADACAPITALS['Alberta'] = 'Edmonton';
SET CANADACAPITALS['Manitoba'] = 'Winnipeg';
SET CANADACAPITALS['Ontario'] = 'Toronto';
SET CANADACAPITALS['Nova Scotia'] = 'Halifax';

在CANADACAPITALS数组中,数组索引值是省份名称,相关数组元素值是相应省会城市的名称。 对关联数组元素指定值时使用的顺序无关紧要。 关联数组的元素按关联数组索引值的升序存储在数组中。

例8: 假设关联数组变量CANADACAPITALSA和CANADACAPITALSB的数组类型为CAPITALSARRAY。 以下SET 赋值语句用于为CANADACAPITALSA赋值。
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;
示例9: 假设P_PHONENUMBERS SQL数组变量被定义为普通数组。 将P_PHONENUMBERS设置为固定数字的数组。
SET P_PHONENUMBERS = ARRAY[9055553907, 4165554213, 4085553678];
示例10 :将SQL数组变量P_PHONENUMBERS设置为从PHONENUMBER表中检索的数字数组。
SET P_PHONENUMBERS =
 ARRAY [SELECT NUMBER
 FROM PHONENUMBERS
 WHERE EMPID = 624];
例11 :假设SQL数组变量P_PHONENUMBERS没有赋值。 将SQL变量P_MYNUMBER的值赋给P_PHONENUMBERS的第一个和第十个元素。 在第一次分配后,P_PHONENUMBERS的基数为1。 在第二次赋值后,基数为10,元素2到9隐式赋值为空值。
SET P_PHONENUMBERS[1]  = P_MYNUMBER;
SET P_PHONENUMBERS[10] = P_MYNUMBER;