DECLARE GLOBAL TEMPORARY TABLE
DECLARE GLOBAL TEMPORARY TABLE 语句定义当前应用程序进程的已声明临时表。 声明的临时表描述未显示在系统目录中。 它不是持久的,不能与其他应用程序进程共享。 定义已声明的同名临时表的每个应用程序进程都有自己的临时表的唯一描述。 当应用程序进程结束时,将删除临时表。
调用
此语句可嵌入应用程序中或者以交互方式发出。 它是可以动态准备的可执行语句。
授权
如果指定了 LIKE 或 AS select-statement 子句,那么该语句的授权标识所拥有的特权必须在 LIKE 子句或 as-result-table 子句中指定的任何表或视图上至少包含下列其中一项:
- 表或视图的 SELECT 特权
- 使用 WITH NO DATA 子句的 LIKE 子句和 AS select-statement 不需要 *READ 权限。
- 表或视图的所有权
- 数据库管理员权限
如果引用了单值类型,那么语句的授权标识所拥有的特权必须至少包含下列其中一项:
- 对于语句中标识的每个单值类型:
- 单值类型的 USAGE 特权,以及
- 对包含单值类型的模式的 USAGE 特权
- 数据库管理员权限
有关与 SQL 特权对应的系统权限的信息,请参阅 检查对表或视图的特权时的相应系统权限 和 检查对单值类型的特权时的相应系统权限。
语法
描述
- 表名
- 命名临时表。 如果明确指定了限定符,那么该限定符必须是 SESSION ,否则将返回错误。 如果未指定限定符,那么会将其隐式定义为 SESSION。 如果已声明的临时表或依赖于已声明的临时表的索引或视图已存在,那么将返回错误。
如果已存在具有相同名称和模式名称 SESSION 的持久表,视图,索引或别名:
- 声明的临时表仍使用 SESSION.table-name定义。 由于声明的临时表名的解析不包含永久库,因此未发出错误。
- 对 SESSION.table-name 的任何引用都将解析为已声明的临时表,而不是名称为 SESSION.table-name的永久表,视图,索引或别名。
将在库 QTEMP 中创建表。
- 系统名称 系统对象标识符
- 标识表的 system-object-identifier 。 system-object-identifier 不得与当前服务器上已存在的表,视图,别名或索引相同。 system-object-identifier 必须是未限定的系统标识。
指定 system-object-identifier 时, table-name 不能是有效的系统对象名。
column-definition
定义列的属性。 必须至少有一个列定义,并且不能超过 8000 个列定义。
列的行缓冲区字节计数之和不得大于 32766 ,如果指定了 VARCHAR , VARGRAPHIC 或 VARBINARY 列,那么不得大于 32740。 此外,如果指定了 LOB 或 XML 列,那么这些列的行数据字节计数总和不得大于 3.5 千兆字节。 有关根据数据类型的列字节计数的信息,请参阅 最大行大小。
- 列名称
- 命名表的列。 不要限定 column-name ,也不要对表的多个列或表的系统列名使用相同的名称。
- FOR COLUMN system-column-name
- 提供列的 IBM i 名称。 请勿对表的多个列或表的列名使用相同的名称。
如果未指定 system-column-name ,并且 column-name 不是有效的 system-column-name ,那么将生成系统列名。 有关如何生成系统列名的更多信息,请参阅 列名生成规则。
- 数据类型
- 指定列的数据类型。
- 内置类型
- 指定内置数据类型。 请参阅 CREATE TABLE 以获取 内置类型的描述。
不能对已声明的临时表指定 ROWID 列或带有 FILE LINK CONTROL 的 DATALINK 列。
- distinct-type-name
- 指定列的数据类型是单值类型 (用户定义的数据类型)。 列的长度,精度和刻度分别是单值类型的源类型的长度,精度和刻度。 如果在没有模式名称的情况下指定了单值类型名称,那么将通过在 SQL 路径上搜索模式来解析单值类型名称。
- DEFAULT
- 指定列的缺省值。 在 列定义中不能多次指定此子句。 无法为以下类型的列指定 DEFAULT ,因为 Db2® 生成缺省值:
- 标识列 (定义为 AS IDENTITY 的列)
- “行更改时间戳记”列
- “行开始”列
- “行结束”列
- “事务开始标识”列
- 所生成的表达式列
- 已生成
- 指定数据库管理器为列生成值。 如果要将列视为下列其中一种类型的列,那么可以指定 GENERATED:
- 标识列
- “行更改时间戳记”列
如果要将列视为下列其中一种类型的列,那么必须指定 GENERATED:
- “行开始”列
- “行结束”列
- “事务开始标识”列
- 所生成的表达式列
- ALWAYS
- 指定当插入或更新行并且必须生成缺省值时,数据库管理器将始终为该列生成值。 “总是”是建议的值。
- BY DEFAULT
- 指定在插入或更新行时,数据库管理器将为列生成值,除非指定了显式值,否则必须生成缺省值。
对于标识列或行更改时间戳记列,数据库管理器会插入或更新指定的值,但不会验证它是否是该列的唯一值,除非标识列或行更改时间戳记列具有唯一约束或唯一索引 (仅指定标识列或行更改时间戳记列)。
- 作为身份
- 指定该列是表的标识列。 一个表只能有一个标识列。 仅当列的数据类型是标度为零的精确数字类型 (SMALLINT , INTEGER , BIGINT , DECIMAL 或 SCALE 为零的 NUMERIC 或基于其中一种数据类型的单值类型) 时,才能指定 aS IDENTITY。 如果指定了 DECIMAL 或 NUMERIC 数据类型,那么精度不得大于 31。
标识列隐式为 NOT NULL。 标识列不能具有 DEFAULT 子句。 请参阅 CREATE TABLE 中的 AS IDENTITY 子句以获取身份属性的描述。
- 对于更新时的每行,作为行更改时间戳记
- 指定列是时间戳记,并且值将由数据库管理器生成。 当插入一行时,数据库管理器会为每行生成一个列值,并为更新了任何列的每行生成一个值。 为行更改时间戳记列生成的值是对应于行插入或更新时间的时间戳记。 如果使用单个 SQL 语句插入多行,那么每行的行更改时间戳记列的值可能不同,以反映插入每行的时间。 不保证生成的值唯一。
- 即行开始
- 指定列包含时间戳记数据,并且值由数据库管理器生成。 在插入行时,数据库管理器会为每行生成一个列值,并为更新了任何列的每行生成一个值。 生成的值是对应于与最新事务关联的开始时间的时间戳记。 如果使用单个 SQL 语句插入多行,那么每行的事务开始时间戳记列的值相同。
- AS 行结束
- 指定每当插入行或更新行中的任何列时,数据库管理器都将指定该列的数据类型的值。 分配的值为 TIMESTAMP "9999-12-30-00.00.00.000000000000"。
- AS 事务启动标识
- 指定每当将行插入到表中或更新行中的任何列时,数据库管理器都将指定该值。 数据库管理器为每个事务分配唯一的时间戳记值或空值。 如果该列可空,并且表中存在不需要调整其值的行开始列,那么会将空值分配给 transaction-start-ID 列。 否则,在执行事务中的第一个数据更改语句期间,将使用时间时钟读数生成该值,该值要求将值分配给表中的行开始列或事务开始标识列,或者删除系统时间段时态表中的行。 如果在单个 SQL 事务中插入或更新多行,那么对于所有行, transaction-start-ID 列的值相同,并且与为另一个事务的列生成的值相同。
- 数据更改操作
- 指定当使用 ON DELETE ADD EXTRA ROW 定义历史记录表时,数据库管理器将为插入的每行,更新任何列的每行以及从系统时间段时态表中删除的所有行生成一个值。 该列将包含下列其中一个值:
- I
- 插入操作
- U
- 更新操作
- D
- 删除操作
- 专用寄存器
- 指定当使用 ON DELETE ADD EXTRA ROW 定义历史记录表时,由数据库管理器为插入的每一行,更新任何列的每一行以及从系统时间段时态表中删除的所有行分配专用寄存器的值。 使用数据更改语句时专用寄存器的值。 如果使用单个 SQL 语句更改了多行,那么对于所有行,该列的值都将相同。
- 内置全局变量
- 指定数据库管理器为插入的每行,更新了任何列的每行以及定义了 ON DELETE ADD EXTRA ROW 的历史记录表时从系统时间段时态表中删除的所有行指定内置全局变量的值。 使用数据更改语句时内置全局变量的值。 如果使用单个 SQL 语句更改了多行,那么对于所有行,该列的值都将相同。
- 字段 PROC
- 将 external-program-name 指定为列的字段过程出口例程。 它必须是不包含 SQL 的 ILE 程序。 它不能是服务程序。
- NOT NULL
- 阻止列包含空值。 省略 NOT NULL 意味着列可以为空。 行更改时间戳记列, 行开始列和行结束列需要 NOT NULL。
- 未隐藏
- 指示列包含在 SQL 语句中对表的隐式引用中。 这是缺省情况。
- 隐式隐藏
- 指示除非通过名称明确引用某列,否则该列在 SQL 语句中不可视。 例如,SELECT * 的结果中不会包含任何隐藏列。 一个表必须至少包含一个未隐式隐藏的列。
- datalink-options
- 指定与 DATALINK 数据类型关联的选项。
- 链接类型 URL
- 将链接类型定义为统一资源定位符(URL)。
- 无链路控制
- 指定将不进行任何检查以确定链接的文件是否存在。 只检查 URL 的语法。 没有对链接文件的数据库管理器控制。
- 时间段定义
- 期间
- 定义表的句点。
- SYSTEM_TIME (begin-column-name, end-column-name)
- 定义名称为 SYSTEM_TIME 的系统周期。 表中不得有名为 SYSTEM_TIME 的列。 一个表只能有一个 SYSTEM_TIME 时间段。
- begin-column-name
- 标识用于记录行有效时间段开始的列。 该名称必须标识表中存在的列。 begin-column-name 不得与 end-column-name相同。 begin-column-name 必须定义为 AS ROW BEGIN。
- 结束列名称
- 标识用于记录行有效时间段结束的列。 在与系统周期时态表相关联的历史记录表中,将设置与系统周期时态表中的 end-column-name 对应的历史记录表列以反映行的删除。 该名称必须标识表中存在的列。 end-column-name 必须定义为 AS ROW END。
LIKE
- table-name 或 view-name
- 指定在指定表或视图中定义的列包含在此表中。 在 LIKE 子句中指定的 table-name 或 view-name 必须标识应用程序服务器上已存在的表或视图。
使用 LIKE 是 n 列的隐式定义,其中 n 是标识的表或视图中的列数。 隐式定义包含 n 列的以下属性 (如果适用于数据类型):
- 列名 (和系统列名)
- 数据类型,长度,精度和小数位
- CCSID
如果在 table-name 后面紧跟指定 LIKE 子句,并且未括在括号中,那么还将包括以下列属性,否则不包括这些属性 (缺省值,标识,行更改时间戳记, 还可以使用 copy-options来控制隐藏属性:
- 缺省值 (如果指定了 table-name ) (未指定view-name )
- 身份属性
- 可空性
- 隐藏属性
- 行更改时间戳记属性
- 列标题和文本 (请参阅 LABEL)
如果 table-name 包含行更改时间戳记列,行开始列,行结束列,事务开始标识列或生成的表达式列,那么新表的相应列仅继承源列的数据类型。 新列不会被视为生成的列。
如果指定的表或视图是非 SQL 创建的物理文件或逻辑文件,那么将除去任何非 SQL 属性。 例如,日期和时间格式将更改为 ISO。
隐式定义不包含所标识的表或视图的任何其他可选属性。 例如,新表不会自动包含表中的主键或外键。 仅当显式指定了可选子句时,新表才具有这些属性和其他可选属性。
as-result-table
- 列名称
- 命名表的列。 不要限定 column-name ,也不要对表的多个列或表的系统列名使用相同的名称。
- FOR COLUMN system-column-name
- 提供列的 IBM i 名称。 请勿对表的多个列或表的列名使用相同的名称。
如果未指定 system-column-name ,并且 column-name 不是有效的 system-column-name ,那么将生成系统列名。 有关如何生成系统列名的更多信息,请参阅 列名生成规则。
- SELECT 语句
- 指定如果要执行 选择语句 ,那么表的列将与 选择语句 的派生结果表中显示的列具有相同的名称和描述。 使用 AS select-statement 是表的 n 列的隐式定义。 其中 n 是将由 select-statement生成的列数。 隐式定义包含 n 列的以下属性 (如果适用于数据类型):
- 列名 (和系统列名)
- 数据类型,长度,精度和小数位
- CCSID
- 可空性
- 列标题和文本 (请参阅 LABEL)
不包括以下属性 (可以使用 copy-options来包括某些属性 ):
- 缺省值
- 隐藏的属性
- 身份属性
- 行更改时间戳记属性
- Row-begin , row-end 和 transaction-start-ID 属性
- 生成的表达式属性
隐式定义不包含 select-statement中引用的表或视图的任何其他可选属性。
表的隐式定义列继承 select-statement的结果表中列的名称。 因此,必须在 select-statement 或所有结果列的列名列表中指定列名。 对于派生自表达式,常量和函数的结果列, select-statement 必须在结果列之后立即包含 AS column-name 子句,或者必须在 select-statement之前的列列表中指定名称。
select-statement 不得引用变量或包含参数标记 (问号)。 select-statement 不得包含 PREVIOUS VALUE 或 NEXT VALUE 表达式。 不能指定 UPDATE , SKIP LOCKED DATA 和 USE AND KEEP EXCLUSIVE LOCKS 子句。
如果 select 语句 包含 隔离子句 ,那么 隔离子句 中指定的隔离级别将应用于整个 SQL 语句。
- 根据所处情况采取正确行动
- 指定执行 select-statement 。 创建表后, select-statement 的结果表行将自动插入到表中。
- 无数据
- 指定不执行 select-statement 。 因此,没有包含一组行的结果表,将使用这些行自动填充该表。
copy-选项
- 包括标识列属性 或 排除标识列属性
- 指定是否继承标识列属性。
- 包括标识列属性
- 指定表继承由 select-statement, table-name生成的列的身份属性 (如果有)。 或 view-name。 通常,如果表,视图或 select-statement 中相应列的元素是表列的名称或直接或间接映射到具有身份属性的基本表列的名称的视图列的名称,那么将复制身份属性。 如果使用 AS select-statement 子句指定了 INCLUDING IDENTITY COLUMN ATTRIBUTES 子句,那么在以下情况下,新表的列不会继承身份属性:
- select-statement 的选择列表包含标识列名的多个实例 (即,多次选择同一列)。
- select-statement 的选择列表包含多个标识列 (即,连接返回了多个标识列)。
- 标识列包含在选择列表中的表达式中。
- select-statement 包含集合操作 (UNION 或 INTERSECT)。
如果未指定 INCLUDING IDENTITY ,那么该表将没有标识列。
- 排除标识列属性
- 指定表不继承由 fullselect table-name生成的列的标识属性 (如果有)。 或 view-name。
- 排除列缺省值 或 INCLUDING COLUMN DEFAULTS 或 USING TYPE DEFAULTS
- 指定是否继承列缺省值。
- 排除列缺省值
- 指定不从源表的定义继承列缺省值。 新表的列的缺省值为空或没有缺省值。 如果列可以为空,那么缺省值为空值。 如果该列不能为空,那么没有缺省值,如果没有为新表的 INSERT 上的列提供值,那么会发生错误。
- 包括列缺省值
- 指定表继承由 select-statement, table-name生成的列的缺省值。 或 view-name。 缺省值是在 INSERT 上未指定值时对列指定的值。
如果指定了 USING TYPE DEFAULTS ,请勿指定 INCLUDING COLUMN DEFAULTS。
如果未指定 INCLUDING COLUMN DEFAULTS ,那么不会继承缺省值。
- 使用类型缺省值
- 指定表的缺省值取决于由 select-statement, table-name生成的列的数据类型。 或 view-name。 如果列可空,那么缺省值为空值。 否则,缺省值如下所示:
数据类型 缺省值 数字 0 定长字符或图形字符串 空白 定长二进制字符串 十六进制零 变长字符串 (varying-length string) 字符串长度 0 日期 INSERT 时的当前日期 时间 INSERT 时的当前时间 时间戳记 INSERT 时的当前时间戳记 Datalink 与 DLVALUE('',' URL ','') 相对应的值 单值类型 单值类型的相应源类型的缺省值。 如果指定了 INCLUDING COLUMN DEFAULTS ,请勿指定 USING TYPE DEFAULTS。
- 包括隐式隐藏列属性 或 排除隐式隐藏列属性
- 指定是否继承隐式隐藏列。
- 包含隐式隐藏列属性
- 指定表从 select-statement, table-name继承隐式隐藏列。 或 view-name ,这些列将使用新表中隐式隐藏的属性进行定义。
如果未指定 INCLUDING 隐式隐藏列属性,那么表将没有任何隐式隐藏列。
- 排除隐式隐藏列属性
- 指定表不继承 fullselect table-name中隐式隐藏的列。 或 view-name。
- 包括行更改时间戳记列属性 或 排除行更改时间戳记列属性
- 指定是否继承行更改时间戳记属性。
- 包括行更改时间戳记列属性
- 指定表继承由 select-statement, table-name生成的列的行更改时间戳记属性 (如果有)。 或 view-name。 通常,如果表,视图或 select-statement 中对应列的元素是表列的名称或直接或间接映射到具有行更改时间戳记属性的基本表列的名称的视图列的名称,那么将复制行更改时间戳记属性。 如果将 INCLUDING ROW CHANGE TIMESTAMP COLUMN ATTRIBUTES 子句与 AS select-statement 子句一起指定,那么在下列情况下,新表的列不会继承行更改时间戳记:
- select-statement 的选择列表包含行更改时间戳记列名的多个实例 (即,多次选择同一列)。
- select-statement 的选择列表包含多个行更改时间戳记列 (即,连接返回了多个行更改时间戳记列)。
- 行更改时间戳记列包含在选择列表中的表达式中。
- select-statement 包含集合操作 (UNION 或 INTERSECT)。
如果未指定 INCLUDING ROW CHANGE TIMESTAMP COLUMN ATTRIBUTES ,那么该表将没有行更改时间戳记列。
- 排除行更改时间戳记列属性
- 指定表不继承由 fullselect table-name生成的列的行更改时间戳记属性 (如果有)。 或 view-name。
- 替换 (WITH REPLACE)
- 指定在已声明的具有指定名称的临时表已存在的情况下,现有表将替换为此语句定义的临时表 (并且将删除现有表的所有行)。
如果未指定 WITH REPLACE ,那么指定的名称不得标识当前会话中已存在的已声明临时表。
- 运行 COMMIT 语句时
- 指定执行 COMMIT 操作时对已声明的临时表执行的操作。 缺省值为 DELETE ROWS。
如果在隔离级别 "无落实" (NC) 下打开已声明的临时表,或者如果执行了 COMMIT HOLD 操作,那么 ON COMMIT 子句不适用。
- 删除行
- 如果表上没有打开 WITH HOLD 游标,那么将删除该表的所有行。
- 保留行
- 将保留表的行。
- NOT LOGGED
- 不会记录对表的更改,包括创建表。 执行 ROLLBACK (或 ROLLBACK TO SAVEPOINT) 操作并且在工作单元 (或 savepoint) 中更改了表时,不会回滚这些更改。 如果在工作单元 (或保存点) 中创建了表,那么将删除该表。 如果在工作单元 (或保存点) 中删除了表,那么将重新创建没有行的表。
- 回滚时
- 指定在执行 ROLLBACK 操作时对声明的临时表执行的操作。
如果已声明的临时表是在隔离级别 "无落实" (NC) 下打开的,或者如果执行了 ROLLBACK HOLD 操作,那么 ON ROLLBACK 子句不适用。
- 删除行
- 将删除表的所有行。 这是缺省情况。
- 保留行
- 将保留表的行。
- RCDFMT 格式名称
- 指定表的 IBM i 记录格式名称的非限定名。 format-name 是系统标识。
如果未指定记录格式名称,那么 format-name 与表的 system-object-name 相同。
- 介质-首选项
- 指定表的首选存储介质。
- UNIT 任何
- 不指定任何首选存储介质。 将从任何可用存储介质分配表的存储器。
- 单元固态硬盘
- 优先使用固态磁盘存储介质。 可以从固态磁盘存储介质(如果可用)分配该表的存储器。
- 存放在内存中
- 指定在查询中使用该表的数据时,是否应该将此数据保留到主存储池中。
- 否
- 不会将数据引入到主存储池中。
- 是
- 数据将被引入到主存储池中。
注意
实例化,作用域和终止: 让 P 表示应用程序进程,并让 T 成为 P 中的应用程序中声明的临时表:
- 当 P 中的程序发出 DECLARE GLOBAL TEMPORARY TABLE 语句时,将创建一个空的 T 实例。
- P 中的任何程序都可以引用 T ,而这些引用中的任何一个都是对 T 的同一实例的引用。 (如果在 SQL 函数, SQL 过程或触发器的复合语句中指定了 DECLARE GLOBAL TEMPORARY 语句; 那么声明的临时表的作用域是应用程序进程而不是复合语句。)
如果在远程服务器上声明了 T ,那么对 T 的引用必须使用用于声明 T 的相同连接,并且在声明 T 之后不得终止该连接。 当与声明 T 的数据库服务器的连接终止时,将断开 T。
- 如果 T 是使用 ON COMMIT DELETE ROWS 子句定义的,那么当落实操作在 P 中终止工作单元并且 P 中没有程序具有依赖于 T 的 WITH HOLD 游标打开时,将删除所有行。
- 如果使用 ON ROLLBACK DELETE ROWS 子句定义 T ,那么当回滚操作终止 P 中的工作单元时,将删除所有行。
- 当声明 T 的应用程序进程终止时,将删除 T。
临时表所有权: 表的 所有者 是执行语句的 线程 的用户概要文件。
临时表权限: 定义已声明的临时表时,将隐式授予 PUBLIC 对该表的所有表特权以及删除该表的权限。
在其他 SQL 语句中引用已声明的临时表: 许多 SQL 语句支持已声明的临时表。 要引用除 DECLARE GLOBAL TEMPORARY TABLE 以外的 SQL 语句中的已声明临时表,必须隐式或显式地使用 SESSION 对该表进行限定。
如果使用 SESSION 作为表名的限定符,但应用程序进程不包含表名的 DECLARE GLOBAL TEMPORARY TABLE 语句,那么数据库管理器假定您未引用已声明的临时表。 数据库管理器将此类表引用解析为永久表。
对使用声明的临时表的限制:
- 不能在 ALTER TABLE , COMMENT , CREATE ALIAS , GRANT , LABEL , LOCK , RENAME 或 REVOKE 语句中指定声明的临时表。
- 不能将已声明的临时表指定为引用约束中的父表
- 如果在 CREATE INDEX 或 CREATE VIEW 语句中引用了已声明的临时表,那么必须在 SESSION (或库 QTEMP) 中创建索引或视图。
使用远程 SELECT 语句创建表: as-result-table 的 select-statement 可以引用正在其中创建表的服务器上的表。 这可以通过使用三部分对象名或定义为引用表或视图的三部分名称的别名来完成。 select-statement 的结果不能包含定义了字段过程的列。 如果远程服务器是 Db2 for LUW 或 Db2 for z/OS®,那么不允许 copy-options 。 如果远程服务器是 Db2 for LUW ,那么应该在 AS 关键字之前显式指定列列表。
语法替代方法: 以下关键字是支持与先前发行版兼容的同义词。 这些关键字是非标准的,不应使用:
- INLINE LENGTH 是 ALLOCATE 的同义词。
- DEFINITION ONLY 是 WITH NO DATA 的同义词
示例
示例 1: 定义声明的临时表,其中包含员工编号,工资,佣金和奖金的列定义。
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_EMP
(EMPNO CHAR(6) NOT NULL,
SALARY DECIMAL(9, 2),
BONUS DECIMAL(9, 2),
COMM DECIMAL(9, 2))
ON COMMIT PRESERVE ROWS示例 2: 假定该基本表 USER1.EMPTAB 存在,并且它包含三列,其中一列是标识列。 声明与基本表具有相同列名和属性 (包括身份属性) 的临时表。
DECLARE GLOBAL TEMPORARY TABLE TEMPTAB1
LIKE USER1.EMPTAB
INCLUDING IDENTITY
ON COMMIT PRESERVE ROWS在以上示例中,数据库管理器使用 SESSION 作为 TEMPTAB1的隐式限定符。

对于 BOOLEAN 列,只能使用 BOOLEAN 常量 TRUE 和 FALSE。