主变量

宿主变量由宿主语言语句直接定义,或由SQL扩展间接定义。 SQL语句中的主机变量必须根据主机变量的声明规则来标识程序中描述的主机变量。 在动态SQL语句中不能引用宿主变量,必须使用参数标记。

主机变量是指SQL语句中引用的以下项目之一:

  • 主机语言中的变量,如 PL/I 变量、C 变量、 Fortran 变量、REXX 变量、Java™ 变量、 COBOL 数据项或汇编语言存储区
  • 由SQL预编译器从使用SQL扩展声明的变量生成的主机语言结构

宿主变量由宿主语言中的语句直接定义,或由SQL扩展间接定义, 如 Db2 对象关系扩展中所述。 在动态SQL语句中不能引用宿主变量,必须使用参数标记。 有关参数标记的更多信息,请参阅动态 SQL 中的变量

SQL语句中的主机变量必须根据主机变量的声明规则来标识程序中描述的主机变量。

在 PL/I、C 和 COBOL 中,主机变量的引用方式与 Fortran 和汇编语言不同。 这在 PL/I、C 和 COBOL 的主机结构中有所解释。 以下内容适用于所有主机语言。

语法图中使用的 “宿主变量 ”一词表示对宿主变量的引用。 在SET 主机变量语句以及FETCH、SELECT INTO或VALUES INTO语句的INTO子句中,主机变量是指一个输出变量,其值由 Db2 分配。 在CALL语句中,宿主变量可以是执行过程后赋值的输出参数,也可以是为过程提供输入值的输入参数,或者既是输入参数又是输出参数。 在其他情况下,宿主变量是一个输入变量,它为 Db2 提供值。

非Java变量引用
除Java外,其他语言中宿主变量引用的通用形式为:
阅读语法图跳过可视化语法图: 主机标识符INDICATOR: 主机标识符

更改开始每个主机标识符必须在源程序中声明,用REXX编写的程序除外。 第一个宿主标识符指定主要变量, 第二个宿主标识符指定相关指示变量。 指示变量必须为小整数。 根据操作的不同,主要变量要么向数据库管理器提供数值,要么从数据库管理器获取数值。 输入主机变量在运行时应用程序代码页中提供一个值。 输出主机变量在数据复制到输出应用程序变量时,会获得一个值,必要时该值会转换为运行时应用程序代码页。 给定的宿主变量可以在同一程序中同时作为输入和输出变量。更改结束

指标变量的目的是:

  • 请指定非空值。 指示变量的 0(零)或正值指定相关的第一个主机标识符提供此主机变量引用的值。
  • 指定空值。 指标变量的负值表示空值。

此外,在输出方面,指标变量的目的是:

  • 表示发生了数值转换错误(例如除以0或溢出)。 指标变量的值为 -2 ,表示由于数值截断或运算警告而导致的结果为空。
  • 表示无法转换字符。 指标变量的值为 -2 ,表示由于字符串转换警告,结果为空。
  • 表示没有返回值。 指示变量的值为 -3 表示结果为空,因为光标当前所在行位于多行FETCH期间检测到的空格中。
  • 如果字符串不是LOB,则报告截断字符串的原始长度。
  • 如果时间在赋值给宿主变量时被截断,则报告时间的秒数部分。

如果省略第二个主机标识符 ,则主机变量没有指示变量。 宿主变量 V1 指定的值始终是 V1 的值,不能将空值赋给变量。 因此,除非相应结果列不能包含空值,否则不要在输出时使用此表单。 如果此表单用于输出主机变量,且返回值为空,则 Db2 会在运行时返回错误。

更改开始INSERT、MERGE或UPDATE语句中输入主机变量的指示变量也可以设置为一些特殊值,以指示目标列将设置为默认值,或指示不应将值分配给目标列。 这些特殊值仅在扩展指示器启用时可用。 当使用扩展指示器(是)绑定选项时,或者当为语句指定带有扩展指示器的准备属性时,扩展指示器将启用。更改结束

更改开始当扩展指示符启用时,INSERT、MERGE或UPDATE语句中分配的输入指示符变量指定关联的主变量目标列分配以下类型之一:更改结束

  • 非空值:0(零)或正值表示关联的主机标识符提供了该主机变量引用的值。
  • NULL: -1、 -2、 -3、 -4 或 -6 值指定空值。
  • 默认值: -5 值指定目标列的默认值。
  • 未指定: -7 值指定将此主机变量视为未指定值,以便分配给语句中的目标列。

更改开始这些指示值也可以用于带有宿主结构的指示器结构中。 启用扩展指示器后,不得使用除正值、零和之前列出的负值以外的指示器值。 DEFAULT和UNASSIGNED扩展指示符值仅可在支持它们的上下文中使用(INSERT、MERGE和UPDATE语句)。 DEFAULT和UNASSIGNED扩展指示器值只能用于包含单个主机参数的表达式,或用于将单个主机参数CAST为列的表达式。 输出指示器绝不能设置为扩展指示器值。 更改结束

更改开始启用扩展指示符后,对于相关指示符值为负的主变量,赋值和比较中的数据类型验证规则将放宽。 对于相关指示器值为 NULL、DEFAULT 或 ASSIGNED 的宿主变量,不强制执行数据类型分配和比较验证规则。 更改结束

更改开始引用宿主变量的 SQL 语句必须位于这些宿主变量的声明范围内。 对于游标SELECT语句中引用的宿主变量,该规则适用于OPEN语句,而不适用于DECLARE CURSOR语句。更改结束

更改开始字符串宿主变量的CCSID为以下值之一:更改结束

更改开始
  • 如果为宿主变量指定了带有 CCSID 子句的 DECLARE VARIABLE 语句,则宿主变量的 CCSID 就是 DECLARE VARIABLE 语句中的 CCSID。
  • 如果未为主变量指定带有 CCSID 子句的 DECLARE VARIABLE 语句,则除非 CCSID 用于外部编码方案,否则在执行包含主变量的 SQL 语句时,主变量的 CCSID 将是应用程序请求者的默认 CCSID。 在这种情况下,宿主变量将转换为当前服务器的默认CCSID。
更改结束

所有对宿主变量的引用都必须以冒号开头。 如果SQL语句引用了不带冒号的主变量,预编译器会因冒号缺失而报错,或将主变量解释为非限定列名,从而可能导致意外结果。 当在也可以引用列名的上下文中引用宿主变量时,宿主变量(不带冒号)会被解释为列名。

Java变量引用
Java中宿主变量引用的通用形式为:
阅读语法图跳过可视化语法图:INOUTINOUTJava标识符( Java 表达式)INDICATOR:Java标识符

每个Java标识符必须在源程序中声明。 第二个Java标识符指定的变量称为指示变量,且必须为短变量。

在Java中,并不总是需要指示变量。 相反,Java类的实例可以设置为空值。 定义为Java基本类型的变量不能设置为空值。 当使用扩展指示变量时,或者当使用Java基本类型赋值空值时,或者当Java基本类型可能在输出时被赋空值时,必须使用指示变量。

如果未指定 IN、OUT 或 INOUT,则默认值取决于变量使用的上下文。 如果Java变量用于INTO子句,则默认值为OUT。 否则,IN为默认值。

如果您正在使用 Db2 precompiler ,请确保在程序中,宿主变量和宿主变量数组的名称是唯一的,即使变量和变量数组位于不同的块、类、过程、函数或子例程中。 您可以使用结构名称限定名称,使其独一无二。