CREATE GLOBAL TEMPORARY TABLE 语句

CREATE GLOBAL TEMPORARY TABLE 语句在当前服务器上创建临时表的描述。 从创建的临时表中选择的每个会话仅检索同一会话已插入的行。 当会话终止时,将删除与会话关联的表的行。

调用

此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。

授权

语句的授权标识所拥有的特权必须包括 DBADM 权限或 CREATETAB 权限以及进一步授权,如下所述:
  • 以下特权和权限之一:
    • 对表空间的 USE 特权
    • SYSADM
    • SYSCTRL
  • 此外还有以下特权和权限之一:
    • 对数据库的 IMPLICIT_SCHEMA 权限(如果该表的隐式或显式模式名不存在)
    • 对模式的 CREATEIN 特权(如果该表的模式名引用现有模式)
    • 对模式的 SCHEMAADM 权限 (如果表的模式名引用了现有模式)

语法

Read syntax diagramSkip visual syntax diagramCREATE GLOBAL TEMPORARY TABLEtable-name(,column-definition)LIKEtable-name1view-namecopy-optionsAS(fullselect)WITH NO DATAcopy-options ON COMMIT DELETE ROWSON COMMIT PRESERVE ROWS NOT LOGGEDON ROLLBACK DELETE ROWSNOT LOGGEDON ROLLBACK PRESERVE ROWSLOGGED INtablespace-name distribution-clause
column-definition
Read syntax diagramSkip visual syntax diagramcolumn-namedata-type column-options
data-type
Read syntax diagramSkip visual syntax diagrambuilt-in-typedistinct-type-name1
built-in-type
Read syntax diagramSkip visual syntax diagramSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)2FOR BIT DATACLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)NCHARNATIONALCHARCHARACTER(1)( integer)NVARCHARNCHAR VARYINGNATIONALCHARCHARACTERVARYING( integer)NCLOBNCHAR LARGE OBJECTNATIONAL CHARACTER LARGE OBJECT(1M)( integerKMG)BINARY(1)( integer)VARBINARYBINARY VARYING(integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMP(6)(integer)BOOLEAN
column-options
Read syntax diagramSkip visual syntax diagram NOT NULL default-clauseGENERATEDALWAYSBY DEFAULTASIDENTITYidentity-options
default-clause
Read syntax diagramSkip visual syntax diagramWITHDEFAULT default-values
default-values
Read syntax diagramSkip visual syntax diagramconstantdatetime-special-registeruser-special-registerCURRENT SCHEMANULLcast-function(constantdatetime-special-registeruser-special-registerCURRENT SCHEMA)EMPTY_CLOB()EMPTY_DBCLOB()EMPTY_NCLOB()EMPTY_BLOB()
copy-options
Read syntax diagramSkip visual syntax diagram INCLUDINGEXCLUDINGCOLUMNDEFAULTS EXCLUDING IDENTITYCOLUMN ATTRIBUTESINCLUDING IDENTITYCOLUMN ATTRIBUTES
distribution-clause
Read syntax diagramSkip visual syntax diagramDISTRIBUTE BY HASH(,column-name)RANDOM
Notes:
  • 1 The specified distinct type cannot have any data type constraints and the source type cannot be an anchored data type.
  • 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).

描述

table-name
指定表。 名称(包括隐式或显式限定符)不能标识目录中描述的表、视图、昵称或别名。 如果指定了两部分的名称,那么模式名不能以“SYS”开头 (SQLSTATE 42939)。
column-definition
定义临时表的列的属性。
列名称
指定表列。 名称不能限定,并且同一名称不能用于表的多列 (SQLSTATE 42711)。
表可以具有以下内容:
  • 最大为 500 列的 4K 页面大小,其中列的字节计数不得大于 4 005。
  • 最大为 1 012 列的 8K 页面大小,其中列的字节计数不得大于 8 101。
  • 最大为 1 012 列的 16K 页大小,其中列的字节计数不得大于 16 293。
  • 最大为 1 012 列的 32K 页面大小,其中列的字节计数不得大于 32 677。

创建的临时表不能包含 row-begin 列、row-end 列或 transaction-start-ID 列。

有关详细信息,请参阅 CREATE TABLE 语句中的行大小

data-type
指定列的数据类型
内置类型
指定内置数据类型。 请参阅 CREATE TABLE 以获取 内置类型的描述。

XML 和 SYSPROC.DB2SECURITYLABEL 数据类型。

distinct-type-name
用于单值类型的用户定义类型。 如果指定了不带模式名称的单值类型名称,则通过在 SQL 路径(对于静态 SQL,由 FUNCPATH 预处理选项定义,对于动态 SQL,由 CURRENT PATH 寄存器定义)上搜索模式来解析单值类型名称。

如果使用单值类型定义了列,那么该列的数据类型为单值类型。 列的长度和刻度分别是单值类型的源类型的长度和刻度。 列的单值类型不能具有任何数据类型约束,并且源类型不能是锚定数据类型 (SQLSTATE 428H2)。

column-options
定义与表列相关的其他选项。
NOT NULL
防止列包含空值。 有关空值的规范,请参阅 CREATE TABLE中的 NOT NULL。
默认条款
指定列的缺省值。
WITH
可选关键字。
缺省值
如果在 INSERT 上未提供值,或者在 INSERT 或 UPDATE 上将值指定为 DEFAULT,那么将提供缺省值。 如果在 DEFAULT 关键字之后未指定缺省值,那么缺省值取决于列的数据类型,如 ALTER TABLE 中所示。

如果该列基于输入表的列,那么在定义缺省值时必须指定特定的缺省值。 不能为输入表的对象标识列指定缺省值 (SQLSTATE 42997)。

如果使用单值类型定义了某个列,那么该列的缺省值是强制转换为单值类型的源数据类型的缺省值。

如果使用结构化类型定义了某个列,那么无法指定 default-clause (SQLSTATE 42842)。

column-definition 中省略 DEFAULT 会导致使用空值作为该列的缺省值。 如果将此类列定义为 NOT NULL,那么该列没有有效的缺省值。

default-values
下面是可指定的特定类型的缺省值。
constant
将常量指定为该列的缺省值。 指定的常量必须:
  • 表示可根据赋值规则分配给该列的值
  • 不是浮点常量,除非使用浮点数据类型定义该列
  • 如果该列的数据类型是十进制浮点,那么为数字常量或十进制浮点特殊值。 如果目标列是 DECFLOAT,那么首先会将浮点常量解释为 DOUBLE,然后将其转换为十进制浮点。 对于 DECFLOAT(16) 列,精度大于 16 位的十进制常量将使用 CURRENT DECFLOAT ROUNDING MODE 专用寄存器指定的取整模式进行取整。
  • 如果常量是十进制常量(例如,1.234 不能是 DECIMAL(5,2) 列的缺省值),那么不能包含超出列数据类型小数位数的非零数字
  • 用不超过 254 个字节表示,包括引号字符、任何引导字符(例如,X 表示十六进制常量)以及标准函数名称和括号中的字符(当常量是 cast-function 的参数时)
datetime-special-register
将在执行 INSERT、UPDATE 或 LOAD 时日期时间专用寄存器(CURRENT DATE、CURRENT TIME 或 CURRENT TIMESTAMP)的值指定为该列的缺省值。 该列的数据类型必须是与指定的专用寄存器对应的数据类型(例如,指定 CURRENT DATE 时,数据类型必须是 DATE)。
user-special-register
将在执行 INSERT、UPDATE 或 LOAD 时用户专用寄存器(CURRENT USER、SESSION_USER、SYSTEM_USER)的值指定为该列的缺省值。 该列的数据类型必须是长度不小于用户专用寄存器的长度属性的字符串。 请注意,可以指定 USER 来代替 SESSION_USER,并且可以指定 CURRENT_USER 来代替 CURRENT USER。
CURRENT SCHEMA
将在执行 INSERT、UPDATE 或 LOAD 时 CURRENT SCHEMA 专用寄存器的值指定为该列的缺省值。 如果指定了 CURRENT SCHEMA,那么该列的数据类型必须是长度大于或等于 CURRENT SCHEMA 专用寄存器的长度属性的字符串。
NULL
指定空值作为列的缺省值。 如果指定了 NOT NULL,那么可以在同一列定义中指定 DEFAULT NULL,但在尝试将列设置为缺省值时会出现错误。
cast-function
这种形式的缺省值只能用于定义为单值类型、BLOB 或日期时间(DATE、TIME 或 TIMESTAMP)数据类型的列。 对于单值类型,该函数的名称必须与该列的单值类型的名称匹配(基于 BLOB 或日期时间类型的单值类型除外)。 如果使用模式名进行限定,那么它必须与单值类型的模式名相同。 如果未进行限定,那么函数解析中的模式名必须与单值类型的模式名相同。 对于基于日期时间类型的单值类型(缺省值是一个常量),必须使用一个函数,并且该函数的名称必须与其隐式或显式模式名为 SYSIBM 的单值类型的源类型名称匹配。 对于其他日期时间列,也可以使用相应的日期时间函数。 对于 BLOB 或基于 BLOB 的单值类型,必须使用一个函数,并且该函数的名称必须是隐式或显式模式名为 SYSIBM 的 BLOB。
constant
指定一个常量作为参数。 该常量必须符合单值类型的源类型或非单值类型的数据类型的常量规则。 如果 cast-function 是 BLOB,那么常量必须是字符串常量。
datetime-special-register
指定 CURRENT DATE、CURRENT TIME 或 CURRENT TIMESTAMP。 该列的单值类型的源类型必须是与指定的专用寄存器对应的数据类型。
user-special-register
指定 CURRENT USER、SESSION_USER 或 SYSTEM_USER。 该列的单值类型的源类型的数据类型必须是长度至少为 8 字节的字符串数据类型。 如果 cast-function 是 BLOB,那么长度属性必须至少为 8 个字节。
CURRENT SCHEMA
指定 CURRENT SCHEMA 专用寄存器的值。 该列的单值类型的源类型的数据类型必须是长度大于或等于 CURRENT SCHEMA 专用寄存器的长度属性的字符串。 如果 cast-function 是 BLOB,那么长度属性必须至少为 8 个字节。
EMPTY_CLOB()、EMPTY_DBCLOB() 或 EMPTY_BLOB()
指定长度为零的字符串作为该列的缺省值。 该列必须具有与函数的结果数据类型相对应的数据类型。

如果指定的值无效,那么将返回错误 (SQLSTATE 42894)。

IDENTITY 和 identity-options
有关标识列的规范,请参阅 CREATE TABLE中的 IDENTITY 和 identity-options
LIKE table-name1 or view-name or nickname
指定该表的列具有与所标识表 (table-name1)、视图 (view-name) 或昵称 (nickname) 的列完全相同的名称和描述。 在 LIKE 之后指定的名称必须标识目录中存在的表,视图或昵称,或声明的临时表。 不能指定类型化表或类型化视图 (SQLSTATE 428EC)。 不能指定受保护表 (SQLSTATE 42962)。 不能指定具有定义为隐式隐藏的列的表 (SQLSTATE 560AE)。
使用 LIKE 是 n 列的隐式定义,其中 n 是标识的表中的列数 (包括隐式隐藏列) ,视图或昵称。 隐式定义取决于 LIKE 后标识的内容。
  • 如果标识了一个表,那么隐式定义包括 table-name1 的各列的列名、数据类型和可空性特征。 如果未指定 EXCLUDING COLUMN DEFAULTS,那么还包括列缺省值。
  • 如果标识了一个视图,那么隐式定义包括 view-name 中定义的全查询的各结果列的列名、数据类型和可空性特征。 视图列的数据类型必须是对表列有效的数据类型。
  • 如果标识了一个昵称,那么隐式定义包括 nickname 的各列的列名、数据类型和可空性特征。
  • 如果标识了使用随机生成方法的随机分布表,那么不包括用于生成随机分布值的 RANDOM_DISTRIBUTION_KEY 列。 除非正在创建的新表共享相同的表分布。

根据 copy-attributes 子句,可以包含或排除列缺省值和身份列属性。 隐式定义不包含已标识表、视图或昵称的任何其他属性。 因此,新表没有任何唯一约束,外键约束,触发器,索引,表分区键或分布键。 该表是在 IN 子句隐式或显式指定的表空间中创建的,只有指定了可选子句,该表才有任何其他可选子句。

如果在 LIKE 子句中标识了一个表并且该表包含 ROW CHANGE TIMESTAMP 列,那么新表的对应列仅继承 ROW CHANGE TIMESTAMP 列的数据类型。 不会将新列视为生成的列。

如果对 table-name1 强制施加行或列级别访问控制 (RCAC),那么新表不会继承 RCAC。

AS (全查询) ,无数据
指定表的列与要执行全查询时将出现在全查询的派生结果表中的列具有相同的名称和描述。 使用 AS (fullselect) 是所创建临时表的 n 列的隐式定义,其中 n 是将由全查询产生的列数。
隐式定义包含 n 列的以下属性 (如果适用于数据类型):
  • 列名
  • 数据类型、长度、精度和小数位
  • 可空性
不包括以下属性 (可以使用 copy-options来包括缺省值和身份属性):
  • 缺省值
  • 身份属性
  • 隐藏的属性
  • ROW CHANGE TIMESTAMP

隐式定义不包含全查询中引用的表或视图的任何其他可选属性。

每个选择列表元素都必须具有唯一名称 (SQLSTATE 42711)。 可以在 Select 子句中使用 AS 子句来提供唯一名称。 全查询不得引用主变量或包含参数标记。 全查询结果列的数据类型必须是对表列有效的数据类型。

如果对 fullselect中指定的任何表强制实施行或列级别访问控制 (RCAC) ,那么不会将 RCAC 级联到新表。

copy-options
这些选项指定是否复制源结果表定义(表、视图或全查询)的其他属性。
INCLUDING COLUMN DEFAULTS
将复制源结果表定义的每个可更新列的列缺省值。 不可更新的列不会在所创建表的相应列中定义缺省值。

如果指定了 LIKE table-name1 ,并且 table-name1 标识基本表,已创建临时表或已声明 临时表,那么缺省值为 INCLUDING COLUMN DEFAULTS。

EXCLUDING COLUMN DEFAULTS
不会从源结果表定义中复制列缺省值。

除非指定了 LIKE table-name ,并且 table-name 标识基本表,创建的临时表或声明的临时表,否则此子句是缺省值。

INCLUDING IDENTITY COLUMN ATTRIBUTES
如果可用,那么将从源的结果表定义中复制身份列属性(START WITH、INCREMENT BY 和 CACHE 值)。 如果表,视图或全查询中对应列的元素是表的列的名称,或者是直接或间接映射到基本表的列名或使用标识属性创建的临时表的视图的列的名称,那么可以复制这些属性。 在所有其他情况下,新临时表的列将不具有身份属性。 例如:
  • 全查询的选择列表包含身份列名称的多个实例(即多次选择同一列)
  • 全查询的选择列表包含多个身份列(即涉及到一个连接)
  • 身份列包含在选择列表的表达式中
  • 全查询包括一个集合操作(union、except 或 intersect)。
EXCLUDING IDENTITY COLUMN ATTRIBUTES
不会从源结果表定义中复制身份列属性。
ON COMMIT
指定执行 COMMIT 操作时对创建的临时表执行的操作。 缺省值为 DELETE ROWS。
DELETE ROWS
如果在表上没有打开 WITH HOLD 游标,那么将删除该表中的所有行。
PRESERVE ROWS
将保留表的行。
LOGGED 或 NOT LOGGED
指定是否记录表的操作。 缺省值为 NOT LOGGED ON ROLLBACK DELETE ROWS
NOT LOGGED
指定将不记录对表执行的插入、更新或删除操作,但会记录表创建或删除操作。 在 ROLLBACK(或 ROLLBACK TO SAVEPOINT)操作期间:
  • 如果已在工作单元(或保存点)中创建了该表,那么将删除该表
  • 如果已在工作单元(或保存点)中删除了该表,那么将重新创建该表,但该表不含任何数据
ON ROLLBACK
指定在执行 ROLLBACK (或 ROLLBACK TO SAVEPOINT) 操作时要对未记录的已创建临时表执行的操作。 缺省值为 DELETE ROWS。
DELETE ROWS
如果表数据已发生更改,那么将删除所有行。
PRESERVE ROWS
将保留表的行。
LOGGED
指定将记录对表执行的插入、更新或删除操作以及表创建或删除操作。
IN 表空间名称
标识将在其中实例化所创建临时表的表空间。 此表空间必须存在并且是 USER TEMPORARY 表空间 (SQLSTATE 42838),而该语句的授权标识具有此表空间的 USE 特权 (SQLSTATE 42501)。 如果未指定此子句,那么将通过选择具有最小足够页大小的 USER TEMPORARY 表空间来确定表的表空间(该语句的授权标识具有该表空间的 USE 特权)。 如果有多个表空间符合条件,那么将根据获得 USE 特权的对象来分配优先级:
  1. 授权标识
  2. 授权标识所属的组
  3. PUBLIC
如果多个表空间仍然符合条件,那么将由数据库管理器做出最终选择。 如果没有 USER TEMPORARY 表空间符合条件,那么将引发错误 (SQLSTATE 42727)。
可以在以下情况下更改表空间的决定:
  • 删除或创建表空间
  • 授予或撤销 USE 特权
表的足够页面大小由行的字节数或列数确定。 有关详细信息,请参阅 CREATE TABLE 语句中的行大小
distribution-clause
指定数据库分区或跨多个数据库分区分布数据的方式。
DISTRIBUTE BY HASH (column-name, ...)
指定在特定列(称为分布键)上使用缺省散列函数作为跨数据库分区的分布方法。 column-name 必须是标识表列的非标准名称 (SQLSTATE 42703)。 不能多次标识同一列 (SQLSTATE 42709)。 数据类型为 BLOB、CLOB、DBCLOB、XML、基于任何这些类型的单值类型或结构化类型的列不能用作分布键的一部分 (SQLSTATE 42962)。

如果未指定此子句,并且表驻留在具有多个数据库分区的多分区数据库分区组中,那么将自动定义缺省分发键。

如果所有列都不满足缺省分布键的要求,那么将创建一个不含任何列的表。 只有在单分区数据库分区组上定义的表空间中才允许此类表。

对于在单分区数据库分区组上定义的表空间中的表,可使用任何具有对分布键有效的数据类型的列集合来定义分布键。 如果未指定此子句,那么不会创建分布键。

DISTRIBUTE BY RANDOM
指定数据库管理器将选择一个分布键以将数据均匀分布在数据库分区组的所有数据库分区中。 将使用随机生成方法来分布数据。 在此方法中,数据库管理器将在表中包含一列以生成值并存储该值,以供在散列函数中使用。 将使用 IMPLICITLY HIDDEN 子句创建该列,因此除非明确包含,否则它不会出现在查询中。 向表添加新行时,将自动生成该列的值。 缺省情况下,列名为 RANDOM_DISTRIBUTION_KEY。 如果该名称与现有列冲突,那么数据库管理器将生成不冲突的名称。

注意

  • 必须先存在用户临时表空间,然后才能创建 已创建 临时表 (SQLSTATE 42727)。
  • 对已创建的临时表启用数据行压缩。 当数据库管理器确定存在性能增益时,将压缩包含以内联方式存储在基本表对象中的 XML 文档的表行数据。 但是,不支持对已创建临时表的 XML 存储对象进行数据压缩。
  • 缺省情况下,对在创建的临时表上创建的索引启用索引压缩。 压缩将显示为开启,但如果未应用正确的许可证( IBM ),则不会压缩索引。 Db2® 存储优化功能)未应用,则不会压缩索引。
  • 实例化和终止: 对于以下说明, P 表示会话, T 是会话 P 中创建的临时表:
    • 由于在 P 中执行了对 T 的第一个引用,因此创建了一个空的 T 实例。
    • P 中的任何 SQL 语句都可以引用 T,并且 P 中对 T 的任何引用都是对同一个 T 实例的引用。
    • 假定已隐式或显式指定 ON COMMIT DELETE ROWS 子句,那么当落实操作在 P 中终止工作单元,并且在 P 中不存在依赖于 T 的打开 WITH HOLD 游标时,落实将包括 DELETE FROM T 操作。
    • 当回滚操作终止 P 中的工作单元或保存点,并且该工作单元或保存点包含对 T 的修改时:
      • 如果指定了 NOT LOGGED ,那么将删除来自 T 的所有行,除非还指定了 ON ROLLBACK PRESERVE ROWS
      • 如果未指定 NOT LOGGED,那么将撤销对 T 的更改
    • 如果指定了 NOT LOGGED 并且 INSERT , UPDATE 或 DELETE 语句在执行期间失败 (相对于编译错误) ,那么将删除 T 中的所有行。
    • 当回滚操作终止 P 中的工作单元或保存点,并且该工作单元或保存点包括创建 T 时,那么回滚包括操作 DROP TABLE T。
    • 如果回滚操作在 P 中终止工作单元或保存点,并且该工作单元或保存点包含已创建的临时表 T 的删除,那么回滚将撤销该表的删除。 如果指定了 NOT LOGGED,那么也会清空该表。
    • 当引用 T 的应用程序进程终止或断开与数据库的连接时,将删除 T 的专用实例并销毁其实例化行。
    • 当与引用了 T 的服务器的连接终止时,将删除 T 的专用实例并销毁其实例化行。
  • 对使用已创建的临时表的限制: 已创建的临时表不能:
    • 在 ALTER , LOCK 或 RENAME 语句中指定 (SQLSTATE 42995)
    • 在引用约束中指定 (SQLSTATE 42995)
  • 替代语法:以下替代语法不是标准语法。 支持这些语法,以便与早期产品版本或其他数据库产品兼容。
    • 可以指定 DEFINITION ONLY 来代替 WITH NO DATA
    • 可以指定 PARTITIONING KEY 子句或 DISTRIBUTE ON 子句来代替 DISTRIBUTE BY 子句。
    • 指定日期时间专用寄存器的值时,可以指定 NOW() 来代替 CURRENT_TIMESTAMP。
    • 在 CHAR 或 VARCHAR 列定义中,您不需要显式指定 CCSID;将自动使用正确的 CCSID。 但是,如果您明确指定了 CCSID,它必须对应于所使用的数据库类型:
      • CCSID ASCII(针对非 Unicode 数据库)
      • CCSID UNICODE(针对 Unicode 数据库)

示例

  • 示例 1: 创建临时表附件 NTMAP。 命名两个列 (CODE 和意味着) ,这两列都不能包含空值。 CODE 包含数字数据,意味着具有字符数据。
       CREATE GLOBAL TEMPORARY TABLE CURRENTMAP
          (CODE        INTEGER      NOT NULL,
           MEANING     VARCHAR(254) NOT NULL)   
  • 示例 2: 创建临时表 TMPDEPT。
       CREATE GLOBAL TEMPORARY TABLE TMPDEPT
          (TMPDEPTNO   CHAR(3)      NOT NULL,
           TMPDEPTNAME VARCHAR(36)  NOT NULL,
           TMPMGRNO    CHAR(6),
           TMPLOCATION CHAR(16) )