标识

标识 是用于构成名称的令牌。 SQL 语句中的标识是 SQL 标识或主机标识。

  • SQL 标识

    有两种类型的 SQL 标识: 普通和定界。

    • 普通标识是后跟零个或多个字符的大写字母,每个字符都是大写字母,数字或下划线字符。 请注意,在指定普通标识时可以使用小写字母,但在处理时会将它们转换为大写字母。 普通标识不能是保留字。
      以下示例显示了普通标识:
         WKLYSAL     WKLY_SAL
    • 定界标识是由双引号括起的一个或多个字符组成的序列。 序列中的前导空格很重要。 序列中的尾部空格并不重要,尽管它们与标识一起存储。 两个连续的引号用于表示定界标识中的一个引号。 当字符序列不符合普通标识时,可以使用定界标识。 这样,标识可以包含小写字母。
      以下示例显示了一系列定界标识:
         "WKLY_SAL"     "WKLY SAL"     "UNION"     "wkly_sal"

    在双字节代码页上创建但由多字节代码页上的应用程序或数据库使用的标识的字符转换可能需要特别考虑: 在转换后,此类标识可能超过标识的长度限制。

  • 主机标识

    主机标识是在主机程序中声明的名称。 构成主机标识的规则是主机语言的规则。 主机标识的长度不应超过 255 个字节,并且不应以 SQL 或 DB2 (大写或小写字符) 开头。

命名约定和隐式对象名限定

构成数据库对象名的规则取决于由该名称指定的对象的类型。 名称可以由单个 SQL 标识组成,也可以使用一个或多个标识 (更具体地标识对象) 对其进行限定。 句点必须分隔每个标识。

语法图对不同类型的名称使用不同的术语。 以下列表定义了这些术语。

别名
指定别名的模式限定名。
attribute-名称
用于指定结构化数据类型的属性的标识。
数组类型名称
用于指定用户定义的数组类型的限定名或非限定名。 数组类型名称的非限定格式是 SQL 标识。 SQL 语句中的未限定数组类型名称是隐式限定的。 隐式限定符是模式名或模块名,由出现 array-type-name 的上下文确定。 限定格式是后跟句点和 SQL 标识的模式名或后跟句点和 SQL 标识的模块名 (也可以由模式名限定)。 如果数组类型是在模块中定义的,并且在同一模块外部使用,那么它必须由 module-name 限定。
授权名称
用于指定用户,组或角色的标识。 对于用户 或组:
  • 有效字符包括: "A" 到 "Z"; "a" 到 "z"; "0" 到 "9"; "#"; "@"; "$"; "_"; "!"; " "("; ")"; "{'; '}"; "-"; "." 和 "^"。
  • 通过命令行处理器输入时,必须使用引号将以下字符定界: "!"; " "("; ")"; "{'; '}"; "-"; "." 和 "^"。
  • 名称不得以字符 "SYS" , "IBM" 或 "SQL" 开头。
  • 名称不得为: "ADMINS" , "访客" , "LOCAL" , "PUBLIC" 或 "USERS"。
  • 定界授权标识不得包含小写字母。
缓冲池名称
指定缓冲池的标识。
列名
用于指定表或视图的列的限定名或非限定名。 限定符是表名,视图名,昵称或关联名。
组件名
用于指定安全标号组件的标识。
条件-名称
用于指定条件的限定名或非限定名。 SQL 语句中的非限定条件名称根据其上下文进行隐式限定。 如果条件在模块中定义并在同一模块外部使用,那么必须使用 module-name 对其进行限定。
约束名
用于指定引用约束,主键约束,唯一约束或表检查约束的标识。
相关名
用于指定结果表的标识。
游标名
用于指定 SQL 游标的标识。 为了实现主机兼容性,可以在名称中使用连字符。
光标类型名称
指定用户定义的游标类型的限定名或非限定名。 游标类型名的非限定格式是 SQL 标识。 SQL 语句中的未限定 cursor-type-name 是隐式限定的,具体取决于上下文。 隐式限定符是模式名或模块名,由出现 cursor-type-name 的上下文确定。 限定格式是后跟句点和 SQL 标识的模式名或后跟句点和 SQL 标识的模块名 (也可以由模式名限定)。 如果游标类型是在模块中定义的并且在同一模块外部使用,那么它必须由 module-name 限定。
游标变量名
用于指定游标类型的全局变量,局部变量或 SQL 参数的限定名或非限定名。 SQL 语句中的非限定游标变量名是隐式限定的,具体取决于上下文。
数据源名称
用于指定数据源的标识。 此标识是由三部分组成的远程对象名的第一部分。
数据库分区组名称
指定数据库分区组的标识。
描述符名称
后跟指定 SQL 描述符区域 (SQLDA) 的主机标识的冒号。 有关主机标识的描述,请参阅 对主变量的引用。 请注意,描述符名称从不包含指示符变量。
单值类型名称
指定单值类型的限定名或非限定名。 非限定形式的 distinct-type-name 是 SQL 标识。 SQL 语句中的非限定单值类型名称是隐式限定的。 隐式限定符是模式名称 或模块名称,由出现 distinct-type-name 的上下文确定。 限定格式为后跟句点和 SQL 标识的模式名或模块名 (也可以由模式名限定) 后跟句点和 SQL 标识。 如果单值类型在模块中定义并在同一模块外部使用,那么必须使用 module-name 对其进行限定。
事件监测器名称
用于指定事件监视器的标识。
功能映射名称
用于指定函数映射的标识。
函数名
用于指定函数的限定名或非限定名。 函数名的非限定格式是 SQL 标识。 SQL 语句中的非限定函数名是隐式限定的。 隐式限定符是模式名称,由函数出现的上下文确定。 限定格式可以是后跟句点和 SQL 标识的模式名,也可以是后跟句点和 SQL 标识的模块名。 如果函数在模块中发布并在同一模块外部使用,那么必须使用 module-name 对其进行限定。
全局变量名
用于指定全局变量的限定名或非限定名。 非限定格式的 global-variable-name 是 SQL 标识。 SQL 语句中的未限定全局变量名是隐式限定的。 隐式限定符是模式名称或模块名称,由显示 global-variable-name 的上下文确定。 限定格式是后跟句点和 SQL 标识的模式名或后跟句点和 SQL 标识的模块名 (也可以由模式名限定)。 如果全局变量在模块中定义并在同一模块外部使用,那么必须使用 module-name 对其进行限定。
组名
指定为结构化类型定义的变换组的非限定标识。
主变量
指定主变量的标记序列。 主变量至少包含一个主标识,如 对主变量的引用中所述。
index-名称
用于指定索引或索引规范的模式限定名。
标签
在 SQL 过程中指定标签的标识。
方法名
用于指定方法的标识。 方法的模式上下文由该方法的主题类型 (或主题类型的超类型) 的模式确定。
模块名
用于指定模块的限定名或非限定名。 SQL 语句中的未限定的模块名是隐式限定的。 隐式限定符是模式名称,由出现模块名称的上下文确定。 限定格式是后跟句点和 SQL 标识的模式名。
昵称
指定联合服务器对表或视图的引用的模式限定名。
程序包名
用于指定包的限定名或非限定名。
parameter-name
用于指定可在过程,用户定义的函数,方法或索引扩展中引用的参数的标识。
分区名
在分区表中指定数据分区的标识。
句点名称
用于指定句点的标识。 SYSTEM_TIME 和 BUSINESS_TIME 是唯一受支持的时间段名称。
过程名
指定过程的限定名或非限定名。 过程名称的非限定格式是 SQL 标识。 SQL 语句中的非限定过程名称是隐式限定的。 隐式限定符是模式名称,由过程出现的上下文确定。 限定格式是后跟句点和 SQL 标识的模式名或后跟句点和 SQL 标识的模块名。 如果过程在模块中定义并在同一模块外部使用,那么它必须由 module-name 限定。
远程授权名称
用于指定数据源用户的标识。 授权名称的规则因数据源而异。
远程函数名
用于指定向数据源数据库注册的函数的名称。
远程对象名称
由三部分组成的名称,用于指定数据源表或视图,并标识表或视图所在的数据源。 此名称的部分是 data-source-name , remote-schema-name 和 remote-table-name。
远程模式名称
用于指定数据源表或视图所属的模式的名称。 此名称是由三部分组成的远程对象名的第二部分。
远程表名
在数据源中指定表或视图的名称。 此名称是由三部分组成的远程对象名称的第三部分。
远程类型名称
数据源数据库支持的数据类型。 请勿将长格式用于内置类型 (例如,使用 CHAR 而不是 CHARACTER)。
角色名
用于指定角色的标识。
行类型名称
用于指定用户定义的行类型的限定名或非限定名。 行类型名称的非限定格式是 SQL 标识。 SQL 语句中的未限定行类型名是隐式限定的。 隐式限定符是模式名称或模块名称,由出现行类型名称的上下文确定。 限定格式是后跟句点和 SQL 标识的模式名或后跟句点和 SQL 标识的模块名 (也可以由模式名限定)。 如果行类型是在模块中定义的,并且在同一模块外部使用,那么它必须由 module-name 限定。
savepoint-名称
用于指定保存点的标识。
模式名
为 SQL 对象提供逻辑分组的标识。 可以隐式确定用作对象名限定符的模式名:
  • 从 CURRENT SCHEMA 专用寄存器的值
  • 从 QUALIFIER 预编译/bind 选项的值
  • 基于使用 CURRENT PATH 专用寄存器的解析算法
  • 基于同一 SQL 语句中另一个对象的模式名称。

为了避免复杂情况,建议不要将名称 SESSION 用作模式,但声明的全局临时表的模式除外 ( 必须 使用模式名称 SESSION)。

安全标签名称
用于指定安全标号的限定名或非限定名。 SQL 语句中的未限定安全标号名在应用时由适用的 security-policy-name 隐式限定。 如果没有隐式适用的 security-policy-name ,那么必须限定该名称。
安全策略名称
指定安全策略的标识。
序列名
用于指定序列的标识。
server-name
指定应用程序服务器的标识。 在联合系统中,服务器名还指定数据源的局部名。
特定名称
指定特定名称的限定名或非限定名。 SQL 语句中的非限定特定名称是隐式限定的,具体取决于上下文。
SQL 变量名
SQL 过程语句中局部变量的名称。 可以在允许主变量名的其他 SQL 语句中使用 SQL 变量名。 该名称可由声明 SQL 变量的复合语句的标签限定。
语句名
用于指定预编译 SQL 语句的标识。
storagegroup-名称
用于指定存储器组的标识。
超类型-名称
用于指定类型的超类型的限定名或非限定名。 根据上下文, SQL 语句中的非限定超类型名称是隐式限定的。
table-name
指定表的模式限定名。
表引用
用于指定表的限定名或非限定名。 公共表表达式中的未限定表引用由缺省模式隐式限定。
表空间-名称
用于指定表空间的标识。
租户名称
指定租户的标识符。
触发器名称
指定触发器的模式限定名。
类型映射名称
用于指定数据类型映射的标识。
type-name
指定类型的限定名或非限定名。 SQL 语句中的非限定类型名称是隐式限定的,具体取决于上下文。
类型表名称
指定类型表的模式限定名。
类型视图名称
指定带类型视图的模式限定名。
用法-list-name
指定用法列表的模式限定名。
用户定义的类型名称
用于指定用户定义的数据类型的限定名或非限定名。 用户定义的类型名称的非限定格式是 SQL 标识。 SQL 语句中的未限定用户定义的 type-name 是隐式限定的。 隐式限定符是模式名 或模块名,由出现用户定义的 type-name 的上下文确定。 限定格式为后跟句点和 SQL 标识的模式名或模块名 (也可以由模式名限定) 后跟句点和 SQL 标识。 如果在模块中定义了用户定义的数据类型并在同一模块外部使用,那么必须使用 module-name 对其进行限定。
视图名称
指定视图的模式限定名。
包装器名称
指定包装器的标识。
XML 模式名称
用于指定 XML 模式的限定名或非限定名。
xsrobject-名称
用于指定 XML 模式存储库中的对象的限定名或非限定名。

数据库对象的别名

可以将别名视为 SQL 对象的备用名称。 因此,可以在 SQL 语句中通过其名称或别名来引用 SQL 对象。

公用别名是可以始终引用而不使用模式名称限定其名称的别名。 公用别名的隐式限定符为SY溅射,也可以显式指定该限定符。 每个租户都有一个唯一的 SYSPUBLIC 命名空间,不与其他租户共享。

别名也称为同义词。

可以在可以使用别名所基于的对象的任何位置使用别名。 即使对象不存在 (尽管在编译引用它的语句时它必须存在) ,也可以创建别名。 如果在别名链上没有循环或重复引用,那么它可以引用另一个别名。 别名只能引用同一数据库中的模块,昵称,序列,表,视图或其他别名。 如果需要新的对象名 (例如,在 CREATE TABLE 或 CREATE VIEW 语句中) ,那么不能使用别名; 例如,如果已创建表别名相应人员,那么后续语句 (例如, CREATE TABLE 人员) ... 将返回错误。

通过别名引用对象的选项未在语法图中显式显示,也未在 SQL 语句的描述中提及。

给定对象类型的新非限定别名 (例如,对于序列) 不能与该对象类型的现有对象具有相同的标准名称。 例如,不能在名为 KANDIL.ORDERID。

在 SQL 语句中使用别名的效果与文本替换的效果类似。 在编译 SQL 语句时必须定义的别名将在语句编译时替换为限定对象名。 例如,如果 PBIRD.SALES 是 DSPN014.DIST4_SALES_148,然后在编译时:
   SELECT * FROM PBIRD.SALES
有效成
   SELECT * FROM DSPN014.DIST4_SALES_148

三部分表格名称

为便于引用不同租户中的对象,对表和视图对象的引用可使用由三部分组成的名称引用来指定对象所在的租户。

参考文献的格式为
 <tenantname>.<schemaname>.<objectname>
其中 "tenantname可以是数据库名称、默认 SYSTEM 租户名称或当前租户名称。
tenantname的值会影响引用的解释方式:
  • 如果使用数据库名称,则假定已指定默认 SYSTEM 租户名称。
  • 如果使用 SYSTEM 租户名称,则假定引用是针对 SYSTEM 租户中的对象。
  • 如果 "tenantname值与运行语句的当前租户相同,则假定引用是针对当前租户中的对象。 该引用将被视为未指定租户名称。
注:三部分名称也可用于引用表格或视图对象中的列,格式与此类似:
<tenantname>.<schemaname>.<objectname>.<columnname>
支持三部分名称引用:
  • 动态或增量绑定 DML SQL 语句
  • 引用全局数据库对象的静态 DML 语句
  • 标准表格或视图对象
不支持三部分名称引用:
  • 不引用全局数据库对象的静态 DML SQL 语句
  • DDL SQL 语句
  • 下列语句或命令:
    • FLUSH PACKAGE CACHE
    • 停顿
    • 运行统计信息
  • 下表中的类型
    • 别名
    • 昵称
    • 拆离表
    • 层次结构表
    • 临时表
    • 类型表
    • 打字意见。

授权标识和授权名称

授权标识 是数据库管理器在数据库管理器与应用程序进程或程序准备进程之间建立连接时获取的字符串。 它指定一组特权。 它还可以指定一个用户或一组用户,但此属性不受数据库管理器控制。

数据库管理器使用授权标识来提供:
  • SQL 语句的授权检查
  • QUALIFIER 预编译 $TAG1 /BIN $TAG2 D 选项和 CURRENT SCHEMA 专用寄存器的缺省值。 授权标识还包含在缺省 CURRENT PATH 专用寄存器和 FUNCPATH 预编译/bind 选项中。
授权标识适用于每个 SQL 语句。 应用于静态 SQL 语句的授权标识是程序绑定期间使用的授权标识。 应用于动态 SQL 语句的授权标识基于绑定时提供的 DYNAMICRULES 选项以及发出动态 SQL 语句的程序包的当前运行时环境:
  • 在具有绑定行为的包中,使用的授权标识是包所有者的授权标识。
  • 在具有定义行为的包中,使用的授权标识是相应例程的定义者的授权标识。
  • 在具有运行行为的包中,使用的授权标识是执行该包的用户的当前授权标识。
  • 在具有调用行为的包中,使用的授权标识是调用例程时当前生效的授权标识。 这称为运行时授权标识。
有关更多信息,请参阅 运行时的动态 SQL 特征

SQL 语句中指定的 授权名称 不应与该语句的授权标识混淆。 授权名称是在各种 SQL 语句中使用的标识。 在 CREATE SCHEMA 语句中使用授权名称来指定模式的所有者。 在 GRANT 和 REVOKE 语句中使用授权名称来指定授权或撤销操作的目标。 授予 X 特权意味着 X (或组 或角色 X的成员) 随后将是需要这些特权的语句的授权标识。

示例

  • 假定 SMITH 是数据库管理器在与应用程序进程建立连接时获取的用户标识和授权标识。 以下语句以交互方式执行:
       GRANT SELECT ON TDEPT TO KEENE
    SMITH 是语句的授权标识。 因此,在动态 SQL 语句中, CURRENT SCHEMA 专用寄存器的缺省值为 SMITH ,而在静态 SQL 中, QUALIFIER 预编译 $TAG1 /BIN $TAG2 D 选项的缺省值为 SMITH。 针对 SMITH 检查执行语句的权限,而 SMITH 是基于 命名约定和隐式对象名限定中描述的限定规则的 table-name 隐式限定符。

    KEENE 是在语句中指定的授权名称。 KEENE 被授予对 SMITH.TDEPT。

  • 假定 SMITH 具有管理权限,并且是以下动态 SQL 语句的授权标识,并且在会话期间未发出 SET SCHEMA 语句:
       DROP TABLE TDEPT
    除去 SMITH.TDEPT 表。
       DROP TABLE SMITH.TDEPT
    除去 SMITH.TDEPT 表。
       DROP TABLE KEENE.TDEPT
    除去 KEENE.TDEPT 表。 请注意 KEENE.TDEPT 和 SMITH.TDEPT 是不同的表。
       CREATE SCHEMA PAYROLL AUTHORIZATION KEENE
    KEENE 是在创建名为 PAYROLL 的模式的语句中指定的授权名称。 KEENE 是模式 PAYROLL 的所有者,并被授予 CREATEIN , ALTERIN 和 DROPIN 特权,能够将其授予他人。

运行时的动态 SQL 特征

BIND 选项 DYNAMICRULES 确定在处理动态 SQL 语句时用于检查授权的授权标识。 此外,该选项还控制其他动态 SQL 属性,例如用于非限定对象引用的隐式限定符,以及是否可以动态调用某些 SQL 语句。

授权标识和其他动态 SQL 属性的值集称为动态 SQL 语句行为。 四种可能的行为是运行,绑定,定义和调用。 如下表所示, DYNAMICRULES BIND 选项的值与运行时环境的组合确定使用哪些行为。 DYNAMICRULES RUN (暗示运行行为) 是缺省值。

表 1. DYNAMICRULES 和运行时环境如何确定动态 SQL 语句行为
DYNAMICRULES 值 独立程序环境中动态 SQL 语句的行为 例程环境中动态 SQL 语句的行为
BIND 绑定行为 绑定行为
运行 运行行为 运行行为
DEFINEBIND 绑定行为 定义行为
DEFINERUN 运行行为 定义行为
INVOKEBIND 绑定行为 调用行为
INVOKERUN 运行行为 调用行为
运行行为
执行程序包的用户的授权标识 (最初连接到数据库的标识) 将用作动态 SQL 语句的授权检查值。 此授权标识还用作动态 SQL 语句中未限定对象引用的隐式限定的初始值。
绑定行为
在运行时,将使用应用于静态 SQL 以进行授权和限定的所有规则。 程序包所有者的授权标识用作动态 SQL 语句的授权检查值。 包缺省限定符用于对动态 SQL 语句中的未限定对象引用进行隐式限定。
定义行为
仅当动态 SQL 语句包含在要在例程上下文中运行的程序包中,并且您已使用 DYNAMICRULES DEFINEBIND 或 DYNAMICRULES DEFINERUN 对该程序包进行绑定时,定义行为才适用。 例程定义者 (而不是例程的程序包绑定程序) 的授权标识用作动态 SQL 语句的授权检查值。 此授权标识还用于在该例程的动态 SQL 语句中隐式限定未限定的对象引用。
调用行为
仅当动态 SQL 语句包含在要在例程上下文中运行的程序包中,并且您已使用 DYNAMICRULES INVOKEBIND 或 DYNAMICRULES INVOKERUN 对该程序包进行绑定时,调用行为才适用。 调用例程时生效的语句授权标识将用作动态 SQL 的授权检查值。 此授权标识还用于在该例程的动态 SQL 语句中隐式限定未限定的对象引用。 下表对此进行了概述。
调用环境 使用的标识
任何静态 SQL 调用例程的 SQL 来自的程序包的 OWNER 的隐式或显式值
在视图或触发器的定义中使用 视图或触发器的定义者
来自绑定行为包的动态 SQL 调用例程的 SQL 来自的程序包的 OWNER 的隐式或显式值
运行行为程序包中的动态 SQL 用于与数据库建立初始连接的标识
定义行为程序包中的动态 SQL 使用调用例程的 SQL 来自的程序包的例程定义者
调用行为程序包中的动态 SQL 调用例程的当前授权标识
运行行为不适用时的受限语句
当绑定,定义或调用行为生效时,不能使用以下动态 SQL 语句 :GRANT , REVOKE , ALTER , CREATE , DROP , COMMENT , RENAME , SET INTEGRITY , SET EVENT MONITOR STATE; 或引用昵称的查询。
DYNAMICRULES 选项的相关注意事项
CURRENT SCHEMA 专用寄存器不能用于限定从绑定,定义或调用行为包执行的动态 SQL 语句中的未限定对象引用。 即使在发出 SET CURRENT SCHEMA 语句以更改 CURRENT SCHEMA 专用寄存器之后也是如此; 寄存器值已更改但未使用。

如果在单个连接期间引用了多个程序包,那么这些程序包所准备的所有动态 SQL 语句都将显示 DYNAMICRULES 选项为该特定程序包指定的行为以及使用这些程序包的环境。

请记住,当程序包显示绑定行为时,程序包的绑定程序不应授予程序包用户不应接收的任何权限,因为动态语句将使用程序包所有者的授权标识。 类似地,当程序包显示定义行为时,例程的定义者不应授予程序包用户不应接收的任何权限。

授权标识和语句准备

如果在绑定时指定了 VALIDATE BIND 选项,那么在绑定时也必须存在处理表和视图所需的特权。 如果这些特权或引用的对象不存在,并且 SQLERROR NOPACKAGE 选项生效,那么绑定操作将失败。 如果指定了 SQLERROR CONTINUE 选项,那么绑定操作将成功,并且将标记任何出错的语句。 任何执行此类语句的尝试都将导致错误。

如果使用 VALIDATE RUN 选项绑定了程序包,那么将完成所有正常绑定处理,但使用应用程序中引用的表和视图所需的特权尚不存在。 如果在绑定时不存在必需的特权,那么只要在应用程序中首次执行语句,就会执行增量绑定操作,并且该语句所需的所有特权都必须存在。 如果不存在必需的特权,那么执行语句将失败。

在运行时使用包所有者的授权标识执行授权检查。

列名

列名 的含义取决于其上下文。 列名可用于:
  • 声明列的名称,如 CREATE TABLE 语句中所示。
  • 标识列,如 CREATE INDEX 语句中所示。
  • 指定列的值,如以下上下文中所示:
    • 在聚集函数中,列名指定应用该函数的组或中间结果表中列的所有值。 例如, MAX (SALARY) 将函数 MAX 应用于组中列 SALARY 的所有值。
    • 在 GROUP BY 或 ORDER BY 子句中,列名指定应用于该子句的中间结果表中的所有值。 例如, ORDER BY DEPT 按列 DEPT 的值对中间结果表进行排序。
    • 在表达式,搜索条件或标量函数中,列名指定对其应用构造的每个行或组的值。 例如,当搜索条件 CODE = 20 应用于某行时,列名 CODE 指定的值是该行中列 CODE 的值。
  • 临时重命名列,如 FROM 子句中 表引用correlation-clause 中所示。

限定列名

列名的限定符可以是表,视图,昵称,别名或相关名。

是否可以限定列名取决于其上下文:
  • 根据 COMMENT ON 语句的格式,可能需要限定单个列名。 必须不限定多个列名。
  • 如果列名指定了列的值,那么可以在用户的选项中对其进行限定。
  • 在 UPDATE 语句的赋值子句中,可以在用户的选项中对其进行限定。
  • 在所有其他上下文中,不能限定列名。

如果限定符是可选的,那么它可以用于两个目的。 它们在 列名限定符以避免岐义相关引用中的列名限定符下进行了描述。

关联名

可以在查询的 FROM 子句和 UPDATE 或 DELETE 语句的第一个子句中定义 相关名 。 例如,子句 FROM X.MYTABLE Z 将 Z 建立为 X.MYTABLE。
   FROM X.MYTABLE Z

将 Z 定义为 X.MYTABLE,只能使用 Z 来限定对该 X.MYTABLE 。

关联名称仅在定义它的上下文中与表,视图,昵称,别名,嵌套表表达式,表函数 或数据更改表引用 相关联。 因此,可以在不同的语句中或在同一语句的不同子句中为不同的目的定义相同的关联名称。

作为限定符,可以使用相关名称来避免岐义或建立相关引用。 它也只能用作表 reference的较短名称。 在此示例中, Z 可能仅用于避免必须输入 X.MYTABLE 多次。

如果为表,视图,昵称或别名指定了相关名称,那么对该表实例的列,视图,昵称或别名的任何限定引用都必须使用相关名称,而不是表,视图,昵称或别名。 例如,以下示例中对 EMPLOYEE.PROJECT 的引用不正确,因为已为 EMPLOYEE 指定了关联名称:

示例
                                                                                          
   FROM EMPLOYEE E                                        
     WHERE EMPLOYEE.PROJECT='ABC'      * incorrect*             
对 PROJECT 的限定引用应改为使用关联名称 E,如以下示例中所示:
   FROM EMPLOYEE E
     WHERE E.PROJECT='ABC'
FROM 子句中指定的名称为 已公开未公开。 如果未指定相关名,那么会在 FROM 子句中显示表,视图,昵称或别名。 关联名始终是公开的名称。 例如,在以下 FROM 子句中,为 EMPLOYEE 指定了关联名,但未为 DEPARTMENT 指定关联名,因此 DEPARTMENT 是公开的名称,而 EMPLOYEE 不是:
   FROM EMPLOYEE E, DEPARTMENT

在 FROM 子句中公开的表名,视图名,昵称或别名可能与在该 FROM 子句中公开的任何其他表名,视图名或昵称或 FROM 子句中的任何相关名称相同。 这可能导致不明确的列名引用返回错误 (SQLSTATE 42702)。

以下列表中显示的前两个 FROM 子句是正确的,因为每个子句包含的对公开的 EMPLOYEE 的引用不超过一个:
  1. 给定 FROM 子句:
       FROM EMPLOYEE E1, EMPLOYEE

    EMPLOYEE.PROJECT 之类的限定引用表示 FROM 子句中 EMPLOYEE 的第二个实例的列。 对 EMPLOYEE 的第一个实例的限定引用必须使用相关名 E1 (E1.PROJECT)。

  2. 给定 FROM 子句:
       FROM EMPLOYEE, EMPLOYEE E2

    EMPLOYEE.PROJECT 表示 FROM 子句中 EMPLOYEE 的第一个实例的列。 对 EMPLOYEE 的第二个实例的限定引用必须使用关联名称 E2 (E2.PROJECT)。

  3. 给定 FROM 子句:
       FROM EMPLOYEE, EMPLOYEE

    此子句中包含的两个公开表名 (EMPLOYEE 和 EMPLOYEE) 相同。 允许这样做,但对特定列名的引用将不明确 (SQLSTATE 42702)。

  4. 给定以下语句:
       SELECT *                                               
         FROM EMPLOYEE E1, EMPLOYEE E2             * incorrect *
         WHERE EMPLOYEE.PROJECT = 'ABC'

    限定引用 EMPLOYEE.PROJECT 不正确,因为 FROM 子句中的两个 EMPLOYEE 实例都具有相关名称。 相反,必须使用任一相关名 (E1.PROJECT 或 E2.PROJECT)。

  5. 给定 FROM 子句:
       FROM EMPLOYEE, X.EMPLOYEE

    对 EMPLOYEE 的第二个实例中列的引用必须使用 X.EMPLOYEE (X.EMPLOYEE.PROJECT)。 如果 X 是动态 SQL 中的 CURRENT SCHEMA 专用寄存器值或静态 SQL 中的 QUALIFIER 预编译/bind 选项,那么无法引用这些列,因为任何此类引用都不明确。

在 FROM 子句中使用相关名称还允许指定要与结果表的列相关联的列名列表的选项。 与关联名称一样,列出的这些列名将成为必须用于在整个查询中引用列的列的 公开 名称。 如果指定了列名列表,那么底层表的列名将变为 未公开

给定 FROM 子句:

   FROM DEPARTMENT D (NUM,NAME,MGR,ANUM,LOC)

D.NUM 表示在表中定义为 DEPTNO 的 DEPARTMENT 表的第一列。 对 D.DEPTNO 不正确,因为列名 DEPTNO 是未公开的列名。

列名称限定符以避免岐义

在函数, GROUP BY 子句, ORDER BY 子句,表达式或搜索条件的上下文中,列名是指某个表,视图,昵称,嵌套表表达式或表函数中列的值。 可能包含该列的表,视图,昵称,嵌套表表达式和表函数称为上下文的 对象表 。 两个或多个对象表可能包含具有相同名称的列; 限定列名的一个原因是指定列来自的表。 列名的限定符在 SQL 过程中也很有用,用于区分列名与 SQL 语句中使用的 SQL 变量名称。

嵌套的表表达式或表函数将在 FROM 子句中将 表引用 视为对象表。 下面的 表引用 不会被视为对象表。

表指示符

用于指定特定对象表的限定符称为 表指示符。 用于标识对象表的子句还会为它们建立表标志符。 例如, SELECT 子句中表达式的对象表在其后面的 FROM 子句中命名:
   SELECT CORZ.COLA, OWNY.MYTABLE.COLA
     FROM OWNX.MYTABLE CORZ, OWNY.MYTABLE
FROM 子句中的表标志符如下所示:
  • 跟在表,视图,昵称,别名,嵌套表表达式或表函数后面的名称既是相关名,也是表标志符。 因此, CORZ 是表指示符。 CORZ 用于限定选择列表中的第一个列名。
  • 公开的表,视图名称,昵称或别名是表指示符。 因此, OWNY.MYTABLE 是表标志符。 OWNY.MYTABLE 用于限定选择列表中的第二个列名。

使用表标志符的公开表名形式限定列时,可以使用公开表名的限定或非限定形式。 如果使用限定格式,那么限定符必须与公开表名的缺省限定符相同。

例如,假定当前模式为 CORPDATA。
SELECT CORPDATA.EMPLOYEE.WORKDEPT FROM EMPLOYEE
有效,因为 FROM 子句中引用的 EMPLOYEE 表完全符合 CORPDATA.EMPLOYEE,与 WORKDEPT 列的限定符匹配。
SELECT EMPLOYEE.WORKDEPT, REGEMP.WORKDEPT
  FROM CORPDATA.EMPLOYEE, REGION.EMPLOYEE REGEMP
也是有效的,因为第一个选择列表列引用了未限定的公开表标志符 CORPDATA.EMPLOYEE(位于 FROM 子句中) 和第二个选择列表列引用表对象 REGION.EMPLOYEE,也在 FROM 子句中。
现在假定当前模式为 REGION。
SELECT CORPDATA.EMPLOYEE.WORKDEPT FROM EMPLOYEE
无效,因为 FROM 子句中引用的 EMPLOYEE 表完全符合 REGION.EMPLOYEE, WORKDEPT 列的限定符表示 CORPDATA.EMPLOYEE 表。

每个表指示符在特定 FROM 子句中都应该是唯一的,以避免对列进行不明确的引用。

避免未定义或不明确的引用

当列名引用列的值时,只有一个对象表必须包含具有该名称的列。 以下情况被视为错误:
  • 没有对象表包含具有指定名称的列。 未定义引用。
  • 列名由表标志符限定,但指定的表不包含具有指定名称的列。 同样,未定义引用。
  • 该名称是未限定的,并且多个对象表包含具有该名称的列。 引用不明确。
  • 列名由表标志符限定,但指定的表在 FROM 子句中不唯一,并且两次出现的指定表都包含该列。 引用不明确。
  • 列名在嵌套表表达式中,该表达式前面没有 TABLE 关键字,或者在作为右外连接或完全外连接的右操作数的表函数或嵌套表表达式中,并且列名未引用嵌套表表达式的全查询中的 table-reference 列。 未定义引用。

通过使用唯一定义的表标志符限定列名来避免不明确的引用。 如果列包含在多个具有不同名称的对象表中,那么表名可用作指示符。 通过使用相关名称后面的列名列表为其中一个对象表的列提供唯一名称,也可以避免不使用表标志符的模棱两可的引用。

当使用表标志符的公开表名形式限定列时,可以使用公开表名的限定或非限定形式。 但是,在完全限定表名,视图名或昵称以及表标志符之后,使用的限定符和使用的表必须相同。
  1. 如果语句的授权标识为 CORPDATA:
       SELECT CORPDATA.EMPLOYEE.WORKDEPT
         FROM EMPLOYEE

    是有效语句。

  2. 如果语句的授权标识为 REGION:
       SELECT CORPDATA.EMPLOYEE.WORKDEPT
         FROM EMPLOYEE                           * incorrect *

    无效,因为 EMPLOYEE 表示表 REGION.EMPLOYEE,但 WORKDEPT 的限定符表示另一个表 CORPDATA.EMPLOYEE。

相关引用中的列名限定符

fullselect 是一种查询形式,可用作各种 SQL 语句的组件。 在任何语句的搜索条件中使用的全查询称为 子查询。 用于在语句中检索单个值作为表达式的全查询称为 标量全查询标量子查询。 查询的 FROM 子句中使用的全查询称为 嵌套表表达式。 搜索条件中的子查询,标量子查询和嵌套表表达式通过本主题的其余部分称为子查询。

子查询可以包括它自己的子查询,而这些子查询又可以包括子查询。 因此, SQL 语句可能包含子查询的层次结构。 层次结构中包含子查询的那些元素据说处于比它们包含的子查询更高的级别。

层次结构的每个元素都包含一个或多个表指示符。 子查询不仅可以引用在层次结构中自己级别标识的表的列,还可以引用先前在层次结构中标识的表的列,返回到层次结构的最高级别。 对在较高级别标识的表的列的引用称为 相关引用

为了与 SQL 的现有标准兼容,允许使用限定列名和非限定列名作为相关引用。 但是,最好是限定子查询中使用的所有列引用; 否则,相同的列名可能会导致意外结果。 例如,如果层次结构中的表更改为包含与相关引用相同的列名,并且再次准备语句,那么该引用将应用于已更改的表。

当限定子查询中的列名时,将搜索层次结构的每个级别,从出现限定列名的同一子查询开始,并继续到层次结构的较高级别,直到找到与限定符匹配的表标志符为止。 找到后,将验证表是否包含给定的列。 如果在比包含列名的级别更高的级别找到表,那么它是对找到表标志符的级别的相关引用。 必须在嵌套表表达式前面添加可选的 TABLE 关键字,以便在嵌套表表达式的全查询上方搜索层次结构。

当未限定子查询中的列名时,将搜索在层次结构的每个级别上引用的表,从出现列名的同一子查询开始,继续到层次结构的更高级别,直到找到列名的匹配项为止。 如果在比包含列名的级别更高的表中找到该列,那么它是对包含该列的表所在级别的相关引用。 如果在特定级别的多个表中找到列名,那么该引用不明确并且被视为错误。

在任一情况下,在以下示例中使用的 T 都是指包含列 C 的表标志符。 列名 T.C (其中 T 表示隐式或显式限定符) 是相关引用,当且仅当满足以下条件时:
  • T.C 。
  • T 未指定在子查询的 from 子句中使用的表。
  • T 指定在包含子查询的层次结构的较高级别使用的表。

由于可以在多个级别识别同一表,视图或昵称,因此建议将唯一的相关名称作为表指示符。 如果 T 用于在多个级别指定表 (T 是表名本身或重复的相关名) ,那么 T.C 是指使用 T 的级别,最直接包含包含 T.C。 如果需要与更高级别的关联,那么必须使用唯一的关联名称。

相关引用 T.C 在要应用两个搜索条件的 T 行或组中标识 C 值: 子查询中的条件 1 ,以及某个更高级别的条件 2。 如果在 WHERE 子句中使用了条件 2 ,那么将针对应用了条件 2 的每行对子查询进行求值。 如果在 HAVING 子句中使用了条件 2 ,那么将针对应用了条件 2 的每个组对子查询进行求值。

例如,在以下语句中,相关引用为 X.WORKDEPT (在最后一行中) 引用了表 EMPLOYEE 中第一个 FROM 子句级别的 WORKDEPT 值。 (该子句将 X 确立为 EMPLOYEE 的关联名称。) 该声明列出了低于其部门平均工资的员工。
   SELECT EMPNO, LASTNAME, WORKDEPT
     FROM EMPLOYEE X
     WHERE SALARY < (SELECT AVG(SALARY)
                       FROM EMPLOYEE
                       WHERE WORKDEPT = X.WORKDEPT)
下一个示例使用 THIS 作为关联名称。 该语句将删除没有员工的部门的行。
   DELETE FROM DEPARTMENT THIS
      WHERE NOT EXISTS(SELECT *
                         FROM EMPLOYEE
                         WHERE WORKDEPT = THIS.DEPTNO)

对变量的引用

SQL 语句中的 变量 指定执行 SQL 语句时可以更改的值。 SQL 语句中使用了多种类型的变量:

主机变量
主变量由主语言的语句定义。 有关如何引用主变量的更多信息,请参阅 对主变量的引用
转换变量
转换变量在触发器中定义,并引用列的旧值或新值。 有关如何引用过渡变量的更多信息,请参阅CREATE TRIGGER 语句
SQL 变量
SQL 变量由 SQL 函数, SQL 方法, SQL 过程,触发器或动态 SQL 语句中的 SQL 复合语句定义。 有关 SQL 变量的更多信息,请参阅SQL 参数、SQL 变量和全局变量参考
全局变量
全局变量由 CREATE VARIABLE 语句定义。 有关全局变量的更多信息,请参阅CREATE VARIABLE以及SQL 参数、SQL 变量和全局变量参考
模块变量
模块变量由 ALTER MODULE 语句使用 ADD VARIABLE 或 PUBLISH VARIABLE 操作定义。 有关模块变量的更多信息,请参阅ALTER MODULE 语句
SQL 参数
SQL 参数由 CREATE FUNCTION , CREATE METHOD 或 CREATE PROCEDURE 语句定义。 有关 SQL 参数的更多信息,请参阅引用 SQL 参数、SQL 变量和全局变量
参数标记
参数标记是在动态 SQL 语句中指定的,如果该语句是静态 SQL 语句,那么将在该语句中指定主变量。 SQL 描述符或参数绑定用于在动态 SQL 语句处理期间将值与参数标记相关联。 有关参数标记的更多信息,请参阅 参数标记

对主变量的引用

主变量 为:
  • 主机语言中的变量,例如 C 变量、C++ 变量、 COBOL 数据项、FORTRAN 变量或 Java™ 变量
或:
  • 由 SQL 预编译器从使用 SQL 扩展声明的变量生成的主语言构造

SQL 语句中引用的内容。 主变量由主语言中的语句直接定义,或者使用 SQL 扩展间接定义。

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

SQL 语句中使用的所有主变量都必须在 SQL DECLARE 节中以除 REXX 以外的所有主语言声明。 不得在 SQL DECLARE 部分外部声明任何变量,这些变量的名称与 SQL DECLARE 部分中声明的变量相同。 SQL DECLARE SECTION 以 BEGIN DECLARE SECTION 开始,以 END DECLARE SECTION 结束。

语法图中使用的元变量 host-variable显示对主变量的引用。 作为 SET 变量语句或 FETCH , SELECT INTO 或 VALUES INTO 语句的 INTO 子句中的目标变量的主变量标识将行或表达式的列中的值赋给的主变量。 在所有其他上下文中, host-variable 指定要从应用程序传递到数据库管理器的值。

语法图中的元变量 host-variable 通常可以扩展为:

Read syntax diagramSkip visual syntax diagram:host-identifierINDICATOR:host-identifier

必须在源程序中声明每个 host-identifier 。 由第二个主机标识指定的变量的数据类型必须为小整数。

第一个主机标识指定 主变量。 根据操作,它将向数据库管理器提供值,或者从数据库管理器提供值。 输入主变量在运行时应用程序代码页中提供值。 为输出主变量提供了一个值,如果需要,在将数据复制到输出应用程序变量时,该值将转换为运行时应用程序代码页。 给定的主变量可以同时充当同一程序中的输入和输出变量。

第二个主机标识指定其 指示符变量。 指示符变量以两种形式出现: 正常指示符变量和扩展指示符变量。

正常指示符变量具有以下用途:
  • 指定非空值。 指示符变量的 0 (零) 或正值指定相关联的第一个 host-identifier 提供此主变量引用的值。
  • 指定空值。 指示符变量的负值指定空值。
  • 在输出时,如果 dft_sqlmathwarn 数据库配置参数设置为 yes (或者在绑定静态 SQL 语句期间设置为 yes ) ,那么指示发生了数字转换错误 (例如除以 0 或溢出)。 指标变量的-2值表示由于数值截断或友好运算警告而导致结果为空。
  • 在输出时,报告截断字符串的原始长度 (如果值的源不是大对象类型)。
  • 在输出时,如果在分配给主变量时时间被截断,那么报告时间的秒数部分。
扩展指示符变量仅限于主变量的输入。 扩展指示符变量具有以下用途:
  • 指定非空值。 0 (零) 或正值指定关联的第一个 host-identifier 提供此主变量引用的值。
  • 指定空值。 -1、-2、-3、-4 或-6表示空值。
  • 请指定缺省值。 -5值表示将此主机变量的目标列设置为默认值。
  • 指定未分配的值。 -7值表示该主机变量的目标列将被视为未在语句中指定的列。

仅当请求时,才会启用扩展指示符变量,否则所有指示符变量都是正常指示符变量。 与常规指示符变量相比,扩展指示符变量对于可以使用空值和非空值的位置没有其他限制。 对于在具有主机结构的指示符结构中使用扩展指示符变量值没有任何限制。 无论在主机应用程序中如何表示扩展指示符变量值,都允许统一应用对缺省值和未分配的扩展指示符变量值的限制。 缺省和未分配的扩展指示符变量值只能在有限的指定用途中出现。 它们可能出现在仅包含单个主变量的表达式中,或者出现在显式强制类型转换 (赋给列) 的主变量中。 输出指示符变量值从不是扩展指示符变量。

当启用扩展指示符变量时,没有限制使用 0 (零) 或正指示符变量值。 但是,不得输入范围-1到-7之外的负指示变量值(SQLSTATE 22010)。 启用时,缺省和未分配的扩展指示符变量值不得出现在不支持它们的上下文中 (SQLSTATE 22539)。

当启用扩展指示符变量时,对于扩展指示符值为负的主变量,将放宽赋值和比较中的数据类型验证规则。 不会对具有空值,缺省值或未分配值的主变量实施数据类型分配和比较验证规则。

例如,如果 :HV1:HV2 用于指定插入或更新值,并且如果 HV2 为负数,那么指定的值为空值。 如果 HV2 不为负数,那么指定的值为 HV1的值。

同样,如果在 FETCH , SELECT INTO 或 VALUES INTO 语句的 INTO 子句中指定了 :HV1:HV2 ,并且如果返回的值为空,那么不会更改 HV1 ,并且 HV2 设置为负值。 如果数据库配置为 dft_sqlmathwarn yes(或在绑定静态 SQL 语句时配置为 yes),则 HV2 可能是 -2。 如果 HV2 是 -2 ,则 HV1 的值无法返回,原因是 HV1 的数值类型转换出错,或用于确定 HV1 值的算术表达式求值出错。 如果返回的值不是空值,则将该值赋值给HV1,HV2设置为零(除非赋值给HV1时需要截断非LOB 字符串;在这种情况下,HV2设置为字符串的原始长度)。 如果作业要求截断时间的秒部分,则HV2设置为秒数。

如果省略了第二个主机标识,那么主变量没有指示符变量。 由主变量引用 :HV1 指定的值始终是 HV1的值,不能将空值指定给该变量。 因此,除非相应的列不能包含空值,否则不应在 INTO 子句中使用此表单。 如果使用此表单并且列包含空值,那么数据库管理器将在运行时生成错误。

引用主变量的 SQL 语句必须在这些主变量的声明范围内。 对于游标的 SELECT 语句中引用的主变量,该规则适用于 OPEN 语句而不是 DECLARE CURSOR 语句。

示例

使用 PROJECT 表,将主变量 PNAME (VARCHAR (26)) 设置为项目名称 (PROJNAME) ,将主变量 STAFF (DECIMAL (5, 2)) 设置为平均人员配置级别 (PRSTAFF) ,将主变量 MAJPROJ (CHAR (6)) 设置为项目 (PROJNO) "IF1000" 的主项目 (MAJPROJ)。 列 PRSTAFF 和 MAJPROJ 可能包含空值,因此请提供指示符变量 STAFF_IND (SMALLINT) 和 MAJPROJ_IND (SMALLINT)。
  SELECT PROJNAME, PRSTAFF, MAJPROJ
    INTO :PNAME, :STAFF :STAFF_IND, :MAJPROJ :MAJPROJ_IND
    FROM PROJECT
    WHERE PROJNO = 'IF1000'
MBCS 注意事项: 是否可以在主变量名称中使用多字节字符取决于主语言。

动态 SQL 中的变量

在动态 SQL 语句中,将使用参数标记来代替主变量。 参数标记 表示 动态 SQL 语句中应用程序将提供值的位置; 即,如果语句字符串是静态 SQL 语句,那么将找到主变量。 以下示例显示了使用主变量的静态 SQL 语句:
   INSERT INTO DEPARTMENT
     VALUES (:HV_DEPTNO, :HV_DEPTNAME, :HV_MGRNO, :HV_ADMRDEPT)
此示例显示了使用 未命名 参数标记的动态 SQL 语句:
   INSERT INTO DEPARTMENT VALUES (?, ?, ?, ?)
此示例显示了使用指定参数标记的动态 SQL 语句:
   INSERT INTO DEPARTMENT 
     VALUES (:DEPTNO, :DEPTNAME, :MGRNO, :ADMRDEPT)
指定的参数标记可用于提高动态语句的可读性。 虽然指定的参数标记看起来像主变量,但指定的参数标记没有关联的值,因此在执行语句时必须为参数标记提供值。 如果已准备使用指定参数标记的 INSERT 语句,并且给定了已准备的语句名称 DYNSTMT ,那么可以使用以下语句为参数标记提供值:
   EXECUTE DYNSTMT 
     USING :HV_DEPTNO, :HV_DEPTNAME :HV_MGRNO, :HV_ADMRDEPT
如果已准备了使用未命名参数标记的 INSERT 语句并给定了已准备的语句名称 DYNSTMT ,那么可以使用此相同的 EXECUTE 语句。

对 LOB 变量的引用

可以在所有主语言中定义常规 BLOB , CLOB 和 DBCLOB 变量, LOB 定位器变量 (请参阅 对 LOB 定位器变量的引用) 以及 LOB 文件引用变量 (请参阅 对 LOB 文件引用变量的引用)。 在允许 LOB 的情况下,语法图中的术语 host-variable 可以引用常规主变量,定位器变量或文件引用变量。 由于这些不是本机数据类型,因此将使用 SQL 扩展,并且预编译器将生成表示每个变量所必需的主语言构造。 对于 REXX ,会将 LOB 映射到字符串。

有时可以定义足够大的变量来保存整个大对象值。 如果此情况成立,并且如果延迟从服务器传输数据没有任何性能优势,那么不需要定位器。 但是,由于主语言或空间限制通常会指示一次将整个大对象存储在临时存储器中,或者由于性能优势,因此可以通过定位器来引用大对象,并且可以将该对象的部分选择到一次只包含大对象的一部分的主变量中或者从这些主变量中更新该大对象的部分。

对 LOB 定位器变量的引用

定位器变量 是包含表示应用程序服务器上 LOB 值的定位器的主变量。

SQL 语句中的定位器变量必须根据声明定位器变量的规则来标识程序中描述的定位器变量。 这始终是通过 SQL 语句间接实现的。

语法图中使用的术语定位器变量显示对定位器变量的引用。 可以展开元变量 locator-variable 以包含与 host-variable相同的 主机标识

与所有其他主变量一样,大对象定位器变量可能具有关联的指示符变量。 大对象定位器主变量的指示符变量的行为方式与其他数据类型的指示符变量的行为方式相同。 从数据库返回空值时,将设置指示符变量,并且定位器主变量保持不变。 这意味着定位器永远不能指向空值。

如果引用了当前未表示任何值的定位器变量,那么会发生错误 (SQLSTATE 0F001)。

在事务落实或任何事务终止时,将释放该事务获取的所有定位器。

对 LOB 文件引用变量的引用

BLOB , CLOB 和 DBCLOB 文件引用变量用于 LOB 的直接文件输入和输出,并且可以在所有主语言中定义。 由于这些不是本机数据类型,因此将使用 SQL 扩展,并且预编译器将生成表示每个变量所必需的主语言构造。 对于 REXX ,会将 LOB 映射到字符串。

文件引用变量表示 (而不是包含) 文件,就像 LOB 定位器表示而不是包含 LOB 字节一样。 数据库查询,更新和插入可以使用文件引用变量来存储或检索单列值。

文件引用变量具有以下属性:
数据类型
BLOB , CLOB 或 DBCLOB。 此属性是在声明变量时指定的。
方向
这必须由应用程序在运行时指定 (作为 "文件选项" 值的一部分)。 方向为:
  • 输入 (用作 EXECUTE 语句, OPEN 语句, UPDATE 语句, INSERT 语句或 DELETE 语句的数据源)。
  • 输出 (用作 FETCH 语句或 SELECT INTO 语句上的数据的目标)。
文件名
这必须由应用程序在运行时指定。 它是下列其中一项:
  • 文件的完整路径名 (建议使用)。
  • 相对文件名。 如果提供了相对文件名,那么会将其附加到客户机进程的当前路径。

在应用程序中,仅应在一个文件引用变量中引用文件。

文件名长度
这必须由应用程序在运行时指定。 它是文件名的长度 (以字节计)。
文件选项
应用程序必须将多个选项中的一个指定给文件引用变量,然后才能使用该变量。 选项由文件引用变量结构中的字段中的 INTEGER 值设置。 必须为每个文件引用变量指定下列其中一个值:
  • 输入 (从客户机到服务器)
    SQL_FILE_READ
    这是可以被打开、读取和关闭的常规文件。 (该选项在 COBOL 中为SQL-FILE-READ,在FORTRAN中为sql_file_read,在REXX中为READ。)
  • 输出 (从服务器到客户机)
    SQL_FILE_CREATE
    创建新文件。 如果该文件已存在,那么将返回错误。 (该选项在 COBOL 中为SQL-FILE-CREATE,在FORTRAN中为sql_file_create,在REXX中为CREATE。)
    SQL_FILE_OVERWRITE (覆盖)
    如果存在具有指定名称的现有文件,那么将覆盖该文件; 否则将创建新文件。 (该选项在 COBOL 中称为SQL-FILE-OVERWRITE,在FORTRAN中称为sql_file_overwrite,在REXX中称为OVERWRITE。)
    SQL_FILE_APPEND
    如果存在具有指定名称的现有文件,那么输出将追加至该文件; 否则将创建新文件。 (该选项在 COBOL 中称为SQL-FILE-APPEND,在FORTRAN中称为sql_file_append,在REXX中称为APPEND。)
数据
这在输入时未使用。 在输出时,实现会将数据长度设置为写入文件的新数据的长度。 长度以字节为单位。

与所有其他主变量一样,文件引用变量可能具有关联的指示符变量。

输出文件引用变量的示例 (以 C 为格式)

给定一个编码为以下内容的声明部分:
   EXEC SQL BEGIN DECLARE SECTION
      SQL TYPE IS CLOB_FILE  hv_text_file;
      char  hv_patent_title[64];
   EXEC SQL END DECLARE SECTION
在进行预处理之后,将执行以下操作:
   EXEC SQL BEGIN DECLARE SECTION
      /* SQL TYPE IS CLOB_FILE  hv_text_file; */
      struct {
          unsigned long  name_length; //  File Name Length
          unsigned long  data_length; //  Data Length
          unsigned long  file_options; // File Options
          char           name[255];   // File Name
      } hv_text_file;
      char  hv_patent_title[64];
   EXEC SQL END DECLARE SECTION
然后,可以使用以下代码从数据库中的 CLOB 列选择到由 :hv_text_file 引用的新文件中。
   strcpy(hv_text_file.name, "/u/gainer/papers/sigmod.94");
   hv_text_file.name_length = strlen("/u/gainer/papers/sigmod.94");
   hv_text_file.file_options = SQL_FILE_CREATE;

   EXEC SQL SELECT content INTO :hv_text_file from papers
        WHERE TITLE = 'The Relational Theory behind Juggling';

输入文件引用变量示例 (C)

给定与前一个相同的声明部分,可以使用以下代码将来自由 :hv_text_file 引用的常规文件的数据插入到 CLOB 列中。
   strcpy(hv_text_file.name, "/u/gainer/patents/chips.13");
   hv_text_file.name_length = strlen("/u/gainer/patents/chips.13");
   hv_text_file.file_options = SQL_FILE_READ:
   strcpy(:hv_patent_title, "A Method for Pipelining Chip Consumption");

   EXEC SQL INSERT INTO patents( title, text )
            VALUES(:hv_patent_title, :hv_text_file);

对结构化类型主变量的引用

结构化类型变量可以在除 FORTRAN , REXX 和 Java 以外的所有主语言中定义。 由于这些不是本机数据类型,因此将使用 SQL 扩展,并且预编译器将生成表示每个变量所必需的主语言构造。

与所有其他主变量一样,结构化类型变量可能具有关联的指示符变量。 结构化类型主变量的指示符变量的行为方式与其他数据类型的指示符变量的行为方式相同。 从数据库返回空值时,将设置指示符变量,并且结构化类型主变量保持不变。

结构化类型的实际主变量定义为内置数据类型。 与结构化类型关联的内置数据类型必须可分配:
  • 从由预编译命令的指定 TRANSFORM GROUP 选项定义的结构化类型的 FROM SQL 变换函数的结果; 以及
  • 到由预编译命令的指定 TRANSFORM GROUP 选项定义的结构化类型的 TO SQL 变换函数的参数。

如果使用参数标记而不是主变量,那么必须在 SQLDA 中指定相应的参数类型特征。 这需要 SQLDA 中的一组 加倍 SQLVAR 结构,并且辅助 SQLVAR 的 SQLDATATYPE_NAME 字段必须填充结构化类型的模式和类型名称。 如果在 SQLDA 结构中省略了该模式,那么会产生错误 (SQLSTATE 07002)。

示例

在 C 程序中定义主变量 hv_polyhv_point (类型为多边形,使用内置类型 BLOB (1048576))。
   EXEC SQL BEGIN DECLARE SECTION;
         static SQL
            TYPE IS POLYGON AS BLOB(1M)
            hv_poly, hv_point;
   EXEC SQL END DECLARE SECTION;

SQL 路径

SQL 路径是模式名的有序列表。 数据库管理器使用 SQL 路径来解析非限定数据类型名称 (内置类型和单值类型) ,全局变量名称,模块名称,函数名和过程名称的模式名称,这些名称显示在除 CREATE , DROP , COMMENT , GRANT 或 REVOKE 语句的主对象以外的任何上下文中。 有关详细信息,请参阅 未限定对象名的限定

例如,如果 SQL 路径是 SYSIBM。 SYSFUN , SYSPROC , SYSIBMADM , SMITH , XGRAPHICS2 和未限定的单值类型名称 MYTYPE 已指定,数据库管理器首先在模式 SYSIBM 中查找 MYTYPE ,然后是 SYSFUN ,然后是 SYSPROC ,然后是 SYSIBMADM ,然后是 SMITH ,然后是 XGRAPHICS2。

使用的 SQL 路径取决于 SQL 语句:
  • 对于静态 SQL 语句 (CALL 变量语句除外) ,使用的 SQL 路径是创建包含包,过程,函数,触发器或视图时指定的 SQL 路径。
  • 对于动态 SQL 语句 (以及对于 CALL 变量语句) , SQL 路径是 CURRENT PATH 专用寄存器的值。 CURRENT PATH 可由 SET PATH 语句设置。
如果未显式指定 SQL 路径,那么 SQL 路径是后跟语句授权标识的系统路径。

未限定对象名的限定

未限定的对象名是隐式限定的。 用于限定名称的规则根据名称标识的对象类型而有所不同。

未限定别名,索引,包,序列,表,触发器和视图名称

未限定的别名,索引,包,序列,表,触发器和视图名称由缺省模式隐式限定。

对于静态 SQL 语句,缺省模式是创建包含函数,包,过程或触发器时指定的缺省模式。

对于动态 SQL 语句,缺省模式是对应用程序进程指定的缺省模式。 可以使用 SET SCHEMA 语句为应用程序进程指定缺省模式。 如果未显式指定缺省模式,那么缺省模式是语句的授权标识。

未限定用户定义的类型,函数,过程,特定全局变量和模块名称

数据类型 (内置类型和单值类型) ,全局变量,模块,函数,过程和特定名称的限定取决于出现非限定名的 SQL 语句:
  • 如果非限定名是 CREATE , ALTER , COMMENT , DROP , GRANT 或 REVOKE 语句的主要对象,那么将使用与限定非限定表名相同的规则来隐式限定该名称 (请参阅 非限定别名,索引,包,序列,表,触发器和视图名称)。 必须在不指定任何限定符的情况下指定 ALTER MODULE 语句的 ADD , COMMENT , DROP 或 PUBLISH 操作的主对象。
  • 如果引用的上下文在模块中,那么数据库管理器将在模块中搜索对象,并对对象类型应用相应的解析以查找匹配项。 如果未找到匹配项,那么将按照下一个项目符号中指定的那样继续搜索。
  • 否则,将按如下所示确定隐式模式名称:
    • 对于单值类型名称,数据库管理器将搜索 SQL 路径并选择 SQL 路径中的第一个模式,以便数据类型存在于该模式中。
    • 对于全局变量,数据库管理器搜索 SQL 路径并选择 SQL 路径中的第一个模式,以便全局变量存在于该模式中。
    • 对于过程名称,数据库管理器将 SQL 路径与过程解析结合使用。
    • 对于函数名,数据库管理器将 SQL 路径与函数解析结合使用。
    • 有关为有源函数指定的特定名称,请参阅 CREATE FUNCTION (有源)

新建 SYSIBM 函数覆盖同名未限定用户定义的函数

现有用户定义的函数或用户定义的过程可能具有与新的内置函数或 SQL 管理例程相同的名称和特征符。 在此类情况下,对动态 SQL 语句中的那些函数或例程的非限定引用将运行内置函数或 SQL 管理例程,而不是用户定义的函数或例程。

缺省 SQL 路径在作为 USER 专用寄存器值的模式名称之前包含模式 SYSIBM , SYSFUN , SYSPROC 和 SYSIBMADM。 当使用 SET PATH 语句或 FUNCPATH 绑定选项显式设置这些系统模式时,这些系统模式也包含在 SQL 路径中。 在函数解析和过程解析期间,在用户定义的函数和用户定义的过程之前迂到 SYSIBM , SYSFUN , SYSPROC 和 SYSIBMADM 模式中的内置函数和 SQL 管理例程。

此更改不会影响数据包或 SQL 对象 (例如视图,触发器或 SQL 函数) 中的静态 SQL。 在这些情况下,用户定义的函数或过程将继续运行,直到显式绑定程序包或删除并创建 SQL 对象为止。

要运行未限定的用户定义例程而不是具有相同名称的新 SYSIBM 函数,请先重命名用户定义的例程或完全限定该名称,然后再运行该例程。 或者,在 SQL 路径中,将用户定义的例程所在的模式放在内置函数和 SQL 管理例程所在的模式之前。 但是,因为会先考虑系统模式,所以在 SQL 路径中提升模式会导致所有内置函数和 SQL 管理例程的解析时间增加。

解析限定对象名

模块中定义的可在模块外部使用的对象必须由模块名称限定。 由于模块是也可以隐式限定的模式对象,因此可以使用未限定的模块名称或模式限定的模块名称来限定已发布的模块对象。 使用非限定模块名称时,对模块对象的引用与不属于模块的模式限定对象相同。 在特定作用域 (例如,复合 SQL 语句) 中,由两部分组成的标识也可以是:
  • 由表名限定的列名
  • 由变量名限定的行字段名称
  • 由标签限定的变量名
  • 由例程名称限定的例程参数名称
在考虑模式对象或模块对象之前,将在这些对象的作用域内解析这些对象。 以下过程用于解析具有两部分标识的对象,这些标识可以是模式对象或模块对象。
  • 如果引用的上下文位于模块中,并且限定符与模块名称匹配,那么数据库管理器将在模块中搜索对象,并应用对象类型的相应解析以在已发布和未发布的模块对象之间查找匹配项。 如果找不到匹配项,那么将按照下一个项目符号中指定的那样继续搜索。
  • 假定限定符是模式名称,如果模式存在,请解析模式中的对象。
  • 如果限定符不是现有模式,或者在与限定符匹配的模式中找不到对象,并且限定符与上下文模块名称不匹配,请在 SQL 路径上的模式中搜索与限定符匹配的第一个模块。 如果已具有对匹配模块的权限,请解析至该模块中的对象(仅考虑已发布模块对象)。
  • 如果在 SQL 路径上找不到作为模块的限定符,并且该限定符与上下文模块名称不匹配,请检查与该限定符相匹配的模块公共同义词。 如果找到该限定符,请解析模块公共同义词标识的模块中的对象(仅考虑已发布模块对象)。

保留包名

已显式保留一组特定的软件包名称供系统使用。 为避免与系统使用这些名称发生冲突,建议任何应用程序都不要使用这些软件包名称。

保留的软件包名称集满足以下条件之一:
  • 程序包模式是保留模式
  • 程序包模式为 NULLID ,并且程序包名与保留的程序包名匹配,或者包含与保留的程序包名前缀匹配的前缀。
以下包名保留在 NULLID 模式中:
  • AGGDISC
  • 普林斯顿
  • 图普勒特
以下包名前缀保留在 NULLID 模式中:
  • 阿奥特
  • 奥地利先令
  • CADM
  • CLI
  • DB2
  • 波利
  • REVA
  • SPIM
  • SPUT
  • SQL
  • SYS
  • TOOL