CREATE VARIABLE 语句
CREATE VARIABLE 语句可定义会话全局变量。
调用
此语句可嵌入应用程序中或者以交互方式发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。
授权
语句授权标识所拥有的特权必须至少包括下列其中一项权限:
- 数据库的 IMPLICIT_SCHEMA 权限(如果变量的隐式或显式模式名不存在)
- 模式的 CREATEIN 特权(如果变量的模式名引用了现有模式)
- 模式的 SCHEMAADM 权限(如果变量的模式名引用了现有模式)
- DBADM 权限
要通过 cursor-value-constructor(使用 select-statement)执行此语句,该语句的授权标识所拥有的特权必须包括执行 select-statement 所需的特权。 请参阅 SQL 查询
中的“授权”部分。
检查 语句 中引用的对象的权限时,不考虑组特权
要替换现有变量,该语句的授权标识必须是现有变量的所有者 (SQLSTATE 42501)。
语法
Notes:
- 1 If data-type1 specifies a CURSOR built-in type or cursor-type-name, only NULL or cursor-value-constructor can be specified. Only DEFAULT NULL can be explicitly specified for array-type-name or row-type-name.
- 2 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
- 3 For version 10.1, you can use the XML data type only as a parameter data type in a cursor value constructor. For version 10.1 Fix Pack 1 or later fix pack releases, you can also use the XML data type to create global variables.
描述
- OR REPLACE
- 指定替换当前服务器上存在的变量的定义。 在目录中替换新定义之前有效地删除现有定义,但针对变量授予的特权不受影响。 如果当前服务器上不存在该变量的定义,那么将忽略此选项。 此选项只能由对象所有者指定。 variable-name
- 命名全局变量。 该名称(包括隐式或显式限定符)不能标识当前服务器上已存在的全局变量 (SQLSTATE 42710)。 如果未指定限定符,那么将隐式分配当前模式。 如果使用模式名显式限定了全局变量名,那么模式名不能以字符
SYS
开头 (SQLSTATE 42939)。 data-type1 - 指定全局变量的数据类型。 不能指定结构化类型 (SQLSTATE 42611)。
- 内置类型
- 指定内置数据类型。 不能为表指定 BOOLEAN 和 CURSOR。 对于 版本 10.1,不能指定 XML 数据类型 (SQLSTATE 42611)。 XML 数据类型支持在 V 10.1 修订包 1 中启动。 有关每种内置数据类型的更完整描述,请参阅
CREATE TABLE
。FOR BIT DATA 可以指定为字符串数据类型的一部分。
- 布尔值
- 适用于布尔型。
- CURSOR
- 表示对基础游标的引用。
anchored-variable-data-type - 标识用于确定全局变量的数据类型的另一个对象。 锚点对象的数据类型的限制与直接指定数据类型或在使用行的情况下创建行类型时的限制相同。
- ANCHOR DATA TYPE TO
- 指示使用锚定数据类型来指定数据类型。
- variable-name2
- 标识全局变量。 引用的变量的数据类型用作全局变量的数据类型。 table-name.column-name
- 标识现有表或视图的列名。 该列的数据类型将用作全局变量的数据类型。
- ROW OF table-name 或 view-name
- 指定全局变量是一排字段,其名称和数据类型基于由 table-name 标识的表或由 view-name 标识的视图的列名和列数据类型。 全局变量的数据类型是未命名的行类型。
- ROW OF 游标变量名
- 指定 具有 名称和数据类型 的字段行, 基于 cursor-variable-name标识的游标变量的字段名称和字段数据类型。 指定的游标变量必须是以下元素之一 (SQLSTATE 428HS):
- 具有强类型游标数据类型的全局变量
- 具有弱类型游标数据类型的全局变量,它是使用 CONSTANT 子句(指定了用于指定所有结果列的 select-statement)创建或声明的。
array-type-name - 指定用户定义数组类型的名称。 如果在不指定模式名称的情况下指定 array-type-name,那么将通过在 SQL 路径中搜索模式来解析该数组类型。 cursor-type-name
- 指定游标类型的名称。 如果指定了 cursor-type-name 而没有指定模式名,那么通过在 SQL 路径中搜索模式来解析游标类型。 distinct-type-name
- 指定单值类型的名称。 已声明变量的长度、精度和小数位数分别是单值类型的源类型的长度、精度和小数位数。 如果在未指定模式名的情况下指定了 distinct-type-name,那么通过在 SQL 路径中搜索模式来解析单值类型。
- REF (type-name)
- 指定引用类型。 如果指定了类型名而没有指定模式名,那么通过在 SQL 路径中搜索模式来解析 type-name。 row-type-name
- 指定用户定义的行类型的名称。 variable 的字段是行类型的字段。 如果指定了 row-type-name 而没有指定模式名,那么通过在 SQL 路径中搜索模式来解析行类型。
- 指定内置数据类型。 不能为表指定 BOOLEAN 和 CURSOR。 对于 版本 10.1,不能指定 XML 数据类型 (SQLSTATE 42611)。 XML 数据类型支持在 V 10.1 修订包 1 中启动。 有关每种内置数据类型的更完整描述,请参阅
- DEFAULT 或 CONSTANT
- 指定全局变量在首次引用时的值。 DEFAULT 或 CONSTANT 子句值是在第一次引用时确定的。 如果两者均未指定,那么全局变量的缺省值为空值。 如果指定了 array-type-name 或 row-type-name,那么只能显式指定 DEFAULT NULL。
- 缺省值
- 定义全局变量的缺省值。 缺省值必须与变量的数据类型赋值兼容。
- CONSTANT
- 指定全局变量具有无法更改的固定值。 使用 CONSTANT 定义的全局变量不能用作任何赋值操作的目标。 固定值必须与该变量的数据类型赋值兼容。
- NULL
- 将 NULL 指定为全局变量的缺省值。 如果指定了 row-type-name,那么全局变量的值是每个字段都具有空值的行。 constant
- 将常量值指定为全局变量的缺省值。 如果 data-type1 指定了 CURSOR 内置类型或 cursor-type-name,那么不能指定 constant (SQLSTATE 42601)。 special-register
- 将专用寄存器的值指定为全局变量的缺省值。 如果 data-type1 指定了 CURSOR 内置类型或 cursor-type-name,那么不能指定 special-register (SQLSTATE 42601)。 global-variable
- 将全局变量的值指定为全局变量的缺省值。 如果 data-type1 指定了 CURSOR 内置类型或 cursor-type-name,那么不能指定 global-variable (SQLSTATE 42601)。 cursor-value-constructor
- cursor-value-constructor 指定与全局变量相关联的 select-statement。 将 cursor-value-constructor 分配给游标变量将定义该游标变量的基础游标。
- ASENSITIVE 或 INSENSITIVE
- 指定游标对更改敏感或不敏感。 有关更多信息,请参阅
DECLARE CURSOR
。 缺省值为 ASENSITIVE。- ASENSITIVE
- 指定游标对结果表下的行执行的插入、更新或删除操作应尽可能敏感,具体取决于 select-statement 的优化方式。 此选项是缺省值。
- INSENSITIVE
- 指定游标对结果表下的行执行的插入、更新或删除操作不敏感。 如果指定了 INSENSITIVE,那么游标是只读的,并且在打开游标时会具体化结果表。 因此,结果表的大小、行的顺序以及每行的值在打开游标后都保持不变。 SELECT 语句不能包含 FOR UPDATE 子句,并且游标不能用于定位更新或删除。
参数-声明, ) - 指定游标的输入参数,包括每个参数的名称和数据类型。
- 参数名
- 命名该参数以将其用作 select-statement 中的 SQL 变量。 该名称不能与游标的任何其他参数名相同。 所选的名称应避免使用 select-statement 中使用的任何列名,因为会在参数名称之前解析列名。 data-type2
- 指定 select-statement 中使用的 cursor 参数的数据类型。
- 内置类型
- 指定内置数据类型。 有关每种内置数据类型的更完整描述,请参阅
CREATE TABLE
。 不能指定 BOOLEAN 和 CURSOR 内置类型 (SQLSTATE 429BB)。
- anchored-parameter-data-type
- 标识用于确定 cursor 参数的数据类型的另一个对象。 锚点对象的数据类型受直接指定数据类型时适用的相同限制约束。
- ANCHOR DATA TYPE TO
- 指示使用锚定数据类型来指定数据类型。
- variable-name
- 标识全局变量。 被引用变量的数据类型将用作 cursor 参数的数据类型。 table-name.column-name
- 标识现有表或视图的列名。 该列的数据类型将用作 cursor 参数的数据类型。
- distinct-type-name
- 指定单值类型的名称。 如果在未指定模式名的情况下指定了 distinct-type-name,那么通过在 SQL 路径中搜索模式来解析单值类型。
- 指定内置数据类型。 有关每种内置数据类型的更完整描述,请参阅
holdability - 指定是否防止游标因落实操作而关闭。 有关更多信息,请参阅
DECLARE CURSOR
。 缺省值为 WITHOUT HOLD。- WITHOUT HOLD
- 不会阻止游标因落实操作而关闭。
- WITH HOLD
- 跨多个工作单元维护资源。 防止游标因落实操作而关闭。
select-statement - 指定游标的 SELECT 语句。 有关更多信息,请参阅
select-statement
。 statement-name - 指定游标的已准备的 select-statement。 请参阅
PREPARE
以获取已准备语句的说明。 目标游标变量不能具有作为强类型用户定义游标类型的数据类型 (SQLSTATE 428HU)。
expression - 将表达式的值指定为全局变量的缺省值。 该表达式可以是
Expressions
中描述的类型的任何表达式。 该表达式必须与变量的数据类型赋值兼容。 该表达式的最大大小为 64K。 缺省表达式不能修改 SQL 数据 (SQLSTATE 428FL) 或执行外部操作 (SQLSTATE 42845)。 如果 data-type1 指定 CURSOR 内置类型或 cursor-type-name,那么不能指定 expression (SQLSTATE 42601)。
规则
- 使用锚定数据类型:锚定数据类型不能引用以下对象 (SQLSTATE 428HS):昵称、类型化表、类型化视图、与基于表达式的索引关联的统计视图、声明的临时表、与弱类型游标关联的行定义、具有与数据库代码页或数据库排序规则不同的代码页或排序规则的对象。
注意
- 会话全局变量具有会话作用域。 这意味着,尽管它们可用于数据库上所有活动的会话,但它们的值对于每个会话都是私有的。
- 数组、布尔值、游标和行全局变量的上下文:作为数组变量、布尔变量或行变量的全局变量只能在复合 SQL(编译型)语句或 SET 变量语句中使用。 作为游标变量的全局变量只能在复合 SQL(编译型)语句中使用。
- 创建但出现错误:如果缺省表达式中引用的对象不存在或被标记为无效或者定义者暂时无权访问该对象,并且数据库配置参数 auto_reval 未设置为 DISABLED,那么仍会成功创建该变量。 该变量将标记为无效,并在下次调用时会重新验证该变量。
- 全局变量值的作用域: 会话全局变量的值一直存在,直到在当前会话中更新,删除或改变全局变量或应用程序会话结束为止。 该值不受 COMMIT
或 ROLLBACK 语句影响。 全局变量的缺省值可能是不确定的,并且取决于为全局变量计算缺省值的时间(例如,对日时间的引用,或对存储在表中的某些数据的引用)。
经常使用的技术,尤其对性能而言,应用程序或产品用它来管理一系列连接并将事务传递至任意连接。 在这些情况下,只能依赖全局变量的非缺省值或全局变量的非确定性初始缺省值,直至事务结束为止。 可能发生此类情况的示例包括:使用 XA 协议、使用连接池、使用连接集中器以及使用 HADR 实现故障转移的应用程序。
- 使用全局变量的特权:尝试读取或写入此语句所创建的全局变量要求尝试此操作的授权标识拥有全局变量的相应权限。 该变量的定义者会隐式授予对该变量的所有特权。
- 缺省值的设置:创建的全局变量在给定作用域内首次被引用时会实例化为其缺省值。 请注意,如果在语句中引用了全局变量,那么其实例化过程与该语句的控制流无关。
- 使用新创建的会话全局变量:如果在会话中创建了一个全局变量,那么在落实工作单元之前,其他会话无法使用该变量。 但是,在落实工作单元之前,可以在创建该变量的会话中使用新的全局变量。
示例
- 示例 1:创建会话全局变量以指示要用于会话的打印机。
CREATE VARIABLE MYSCHEMA.MYJOB_PRINTER VARCHAR(30) DEFAULT 'Default printer' - 示例 2: 创建会话全局变量以指示员工所在的部门。
CREATE VARIABLE SCHEMA1.GV_DEPTNO INTEGER DEFAULT ((SELECT DEPTNO FROM HR.EMPLOYEES WHERE EMPUSER = SESSION_USER)) - 示例 3: 创建会话全局变量以指示当前用户的安全级别。
CREATE VARIABLE SCHEMA2.GV_SECURITY_LEVEL INTEGER DEFAULT (GET_SECURITY_LEVEL (SESSION_USER)) - 示例 4: 创建一个会话全局变量作为 STAFF 表上的游标,该游标将返回所指定作业类型的每个员工的名称。 按部门编号对结果进行排序。
CREATE VARIABLE STAFFJOBS CURSOR CONSTANT (CURSOR (WHICHJOB CHAR(5)) FOR SELECT NAME, DEPT FROM STAFF WHERE JOB = WHICHJOB ORDER BY DEPT) - 示例 5:创建 XML 数据类型的全局变量:
CREATE VARIABLE MYSCHEMA.CUSTOMER_HISTORY_VAR XML
