CREATE GLOBAL TEMPORARY TABLE 语句

CREATE GLOBAL TEMPORARY TABLE 语句用于在当前服务器上创建临时表的描述。

调用 CREATE GLOBAL TEMPORARY TABLE

此语句可嵌入应用程序中或者以交互方式发出。 它是可动态准备的可执行语句。

授权 CREATE GLOBAL TEMPORARY TABLE

以下定义的特权套装必须至少包含以下一项:

  • CREATETMTAB系统特权
  • 任何数据库的 CREATETAB 数据库权限
  • 任何数据库的DBADM、DBCTRL或DBMAINT权限
  • SYSADM 或 SYSCTRL 权限
  • 系统 DBADM
  • 更改开始安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)更改结束

但是,如果您正在为他人创建临时表,且表限定符不是您的授权ID,则DBADM、DBCTRL或DBMAINT权限是不够的。

当列的数据类型为特定类型或指定了LIKE子句时,可能需要附加权限。 有关详细信息,请参阅 distinct-type 和LIKE的描述。

权限设置:

权限设置与 CREATE TABLE 语句的权限设置相同。 有关详细信息,请参阅有关 CREATE TABLE 授权的信息。

CREATE GLOBAL TEMPORARY TABLE的语法

阅读语法图跳过可视化语法图 CREATE GLOBAL TEMPORARY TABLE table-name (,column-definition)LIKEtable-name视图名称CCSIDASCIIEBCDICUNICODE

列定义:

阅读语法图跳过可视化语法图 列名 数据类型 NOT NULL

数据类型:

阅读语法图跳过可视化语法图built-in-type独特类型名称

内置类型:

阅读语法图跳过可视化语法图SMALLINTINTEGERINTBIGINTDECIMALDECNUMERIC(5,0)( 整数整数)FLOAT(53)( 整数)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( 整数)VARCHARCHARACTERCHARVARYING( 整数)FORSBCSMIXEDBITDATACCSID 12081GRAPHIC(1)( 整数)VARGRAPHIC( 整数)CCSID 12001BINARY(1)( 整数)BINARY VARYINGVARBINARY( 整数)DATETIMETIMESTAMP(6)(整数)WITHOUT TIME ZONEWITH TIME ZONE
注意:
  • 1 CCSID子句仅适用于EBCDIC创建的全局临时表中的字符串或图形字符串列。

描述 CREATE GLOBAL TEMPORARY TABLE

table-name
指定临时表。 该名称(包括隐式或显式限定符)不得标识数据库服务器上存在的表、视图、别名、同义词或临时表,也不得标识 SYSIBM.SYSPENDINGOBJECTS 目录表中存在的表。

临时表的资格规则与其他表相同。

拥有者通过授权选项获得桌子上的所有特权,并有权将桌子放下。

更多信息,请参阅表格名称指南

column-definition
为表的每个实例定义列的属性。 定义的列数不得超过750。 最大记录大小不得超过32714字节。 最大行数不得超过32706字节(比最大记录数少8字节)。
列名
命名列。 名称不能修饰,且不能与表格中其他列的名称相同。
data-type
指定列的数据类型。 数据类型可以是内置数据类型,也可以是不同的类型。
内置式
列的数据类型是内置数据类型。

有关数据类型的更多信息和适用规则,请参阅内置类型

独特类型
任何非基于LOB或ROWID数据类型的特殊类型。 特权集必须隐式或显式包含对不同类型的USAGE特权。
NOT NULL
指定列不能包含空值。 省略NOT NULL表示该列可以包含空值。
像表名视图名一样
指定 CREATE GLOBAL TEMPORARY TABLE table-name 子句中标识的表的列与 LIKE table-name 或 LIKE view-name 子句中标识的列具有完全相同的名称和描述。 在 LIKE 后面指定的名称必须标识当前服务器上存在的表、视图或临时表。 LIKE后面指定的名称不能是仅包含加速器的表。 视图不能包含长度为0的列。

特权集必须隐式或显式包含对已识别表或视图的 SELECT 特权。

如果 LIKE表名子句中标识的表不是已创建的临时表,或者 LIKE视图名子句中标识的视图不是基于已创建的临时表:
  • 如果 LIKE table-name 或 LIKE view-name 子句中标识的表或视图的任何列具有临时表中的列不允许的属性值,则在创建临时表时会忽略该属性值。 除非另有说明,否则新创建的临时表中与LIKE table-name 或LIKE view-name 中的列对应的列具有该属性的默认值。
  • 如果在LIKE table-nameLIKE view-name子句中标识的表或视图的任何列允许使用非NULL的默认值,则创建新临时表时忽略该默认值。 新创建的临时表中与表名视图名对应的列没有默认值,因为创建的临时表中任何列都不允许使用非空默认值。
  • 更改开始如果 LIKE 表名或 LIKE 视图名子句中标识的表或视图的任何列是 DEFAULT NULL 的可空列,则在创建临时表时会忽略 DEFAULT NULL。 临时表中与表名称视图名称中的列相对应的列没有默认值。更改结束
CCSID 编码方案
指定表中存储的字符串数据的编码方案。
ASCII
指定必须使用服务器的 ASCII CCSID 对数据进行编码。

如果未为安装指定有效的 ASCII CCSID,则会发生错误。

EBCDIC
指定必须使用服务器的EBCDIC CCSID对数据进行编码。

如果未为安装指定有效的EBCDIC CCSID,则会发生错误。

UNICODE
指定必须使用服务器的CCSID对数据进行编码,以实现Unicode。

如果未为安装指定有效的Unicode CCSID,则会发生错误。

通常,每种编码方案只需要一个CCSID。 当使用混合、图形或Unicode数据时,需要额外的CCSID。 如果CCSID未定义,则会发生错误。

更改开始可以为创建的临时表或创建的临时表中的单个列指定 CCSID 子句。 如果为表指定了CCSID子句,则该CCSID子句将指定表的编码方案,而不管是否也指定了LIKE子句。 如果没有为表指定 CCSID 子句,则表的编码方案为 EBCDIC。更改结束

更改开始如果为列指定了 CCSID 子句,则创建的临时表的编码方案必须是 EBCDIC。 如果未为列指定 CCSID 子句,且未为表指定 LIKE 子句,则列的 CCSID 与表的 CCSID 相同。 如果指定了 LIKE 子句,且 LIKE 子句中指定的源表是带有 Unicode 列的 EBCDIC 表,则创建的临时表中与源表中 Unicode 列相对应的列也是 Unicode 列。更改结束

创建全局临时表注意事项

车主特权

表的所有者拥有所有表的权限(参见 GRANT 语句(表或视图权限) ),并能将这些权限授予其他人。 有关对象所有权的更多信息,请参阅授权、特权、权限、掩码和对象所有权

实例化和终止
设T为当前服务器上定义的临时表,设P为应用程序进程:
  • 在P中任何程序执行的OPEN、SELECT INTO或SQL数据更改操作中,第一次隐式或显式引用T时,将创建一个空的T实例。
  • P中的任何程序都可以引用T,而P中的程序对T的任何引用都是对T实例的引用。

    当提交操作终止 P 中的单元工作且 P 中没有程序具有依赖于 T 的打开的 WITH HOLD 光标时,提交将包含 DELETE FROM T 操作。

  • 当回滚操作终止了 P 中的工作单元时,回滚操作包括 DELETE FROM T 操作。
  • 当与创建 T 实例的数据库服务器的连接终止时,T 实例将被销毁。 然而,T的定义仍然存在。 必须执行DROP TABLE语句来删除T的定义。
限制和扩展
设T为临时表:
  • T列不能有默认值,只能为空。
  • T列不能具有LOB或ROWID数据类型(或基于它们的特定类型)。
  • T不能有唯一约束、参照约束或检查约束。
  • 在参照约束中,T不能被定义为父项。
  • T 不能用于:
    • CREATE INDEX语句。
    • 一个锁定表语句。
    • 作为UPDATE语句的对象,其中对象为T或T的视图。 但是,您可以在UPDATE语句(包括MERGE语句的更新操作)的WHERE子句中引用T。
    • Db2 实用命令。
  • 如果在CREATE VIEW语句的fullselect 中引用了T,则不能在CREATE VIEW语句中指定WITH CHECK OPTION子句。
  • ALTER TABLE T仅当语句用于向T添加列时才有效。 添加到T中的任何列都必须具有默认值null。

    当您修改 T 时,任何引用该表的包都将失效, Db2 将在下次运行时自动重新绑定包。

  • DELETE FROM T 或 T 的视图仅在语句中不包含 WHERE 或 WHERE CURRENT OF 子句时有效。 此外,仅当创建视图(CREATE VIEW)时不使用 WHERE 子句时,DELETE FROM 视图 T 才有效。 DELETE FROM语句用于从表或视图中删除所有行。
  • 您可以在任何子选择语句的 FROM 子句中引用 T。 如果在选择语句的第一个 FROM 子句中引用 T,则不能指定 FOR UPDATE 子句。
  • 您不能使用DROP DATABASE语句来隐式删除T。 要删除T,请在DROP TABLE语句中引用T。
  • 只要建立实例的 Db2 连接未终止,使用SQL语句以三部分表名实例化的临时表就可以在同一应用程序进程中由另一个使用相同名称的SQL语句访问。
  • 授予 T 的所有权限是有效的,但您不能授予 T 的特定权限。

    在ALL权限中,只有ALTER、INSERT、DELETE和SELECT权限可以在T上使用。

  • 撤销对T的所有特权是有效的,但您无法撤销T的特定特权。
  • A COMMIT操作会删除应用程序进程的每个临时表的所有行,但如果应用程序进程中的任何程序有一个依赖于T的打开的WITH HOLD游标,则不会删除T的行。 此外,如果RELEASE(COMMIT)生效且没有打开的WITH HOLD游标依赖于T,则T的所有逻辑工作文件也会被删除。
  • 回滚操作会删除应用程序进程的每个临时表的所有行和所有逻辑工作文件。
  • 使用临时表时,您可以重复使用线程,临时表名的逻辑工作文件在取消分配之前一直可用。 当线程被重新使用时,不会为该临时表名分配新的逻辑工作文件。
  • 您可以在以下语句中参考T:
    语句 语句 语句
    • ALTER FUNCTION
    • ALTER PROCEDURE
    • COMMENT
    • CREATE ALIAS
    • CREATE FUNCTION
    • CREATE PROCEDURE
    • CREATE SYNONYM
    • 创建相似表
    • CREATE VIEW
    • DESCRIBE TABLE
    • 声明表
    • DELETE(如果其中不包含WHERE子句)
    • DROP TABLE
    • INSERT
    • 标签
    • SELECT INTO

替代语法和同义词 :为了与 Db2 的早期版本兼容,在定义列的数据类型时,您可以将LONG VARCHAR指定为 VARCHAR(整数) 的同义词,将LONG VARGRAPHIC指定为 VARGRAPHIC(整数) 的同义词。 但是,不鼓励使用这些同义词,因为语句处理后, Db2 会将LONG VARCHAR列视为VARCHAR,将LONG VARGRAPHIC列视为VARGRAPHIC。

例子 CREATE GLOBAL TEMPORARY TABLE

示例1 :创建临时表CURRENTMAP。 请列出两个列,分别是“代码”和“含义”,这两个列都不能为空。 CODE包含数字数据,MEANING包含字符数据。 假设安装面板 DSNTIPF 上的混合数据字段值为 NO,则含义列的子类型为 SBCS:
CREATE GLOBAL TEMPORARY TABLE CURRENTMAP
     (CODE INTEGER NOT NULL, MEANING VARCHAR(254) NOT NULL);
示例2 :创建临时表EMP:
CREATE GLOBAL TEMPORARY TABLE EMP
     (TMPDEPTNO   CHAR(3)     NOT NULL,
      TMPDEPTNAME VARCHAR(36) NOT NULL,
      TMPMGRNO    CHAR(6)             ,
      TMPLOCATION CHAR(16)            );