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 特权对应的系统权限的信息,请参阅 检查对表或视图的特权时的相应系统权限检查对单值类型的特权时的相应系统权限

语法

读取语法图跳过可视语法图DECLARE GLOBAL TEMPORARY TABLEtable-name FOR SYSTEM NAME系统对象标识符 (,column-definition句点定义LIKEtable-name视图名称copy-选项)LIKEtable-name视图名称copy-选项as-result-table WITH REPLACEON COMMIT DELETE ROWSON COMMIT PRESERVE ROWSNOT LOGGEDON ROLLBACK DELETE ROWSON ROLLBACK PRESERVE ROWS1RCDFMT格式名2media-首选项内存首选项
介质-首选项
读取语法图跳过可视语法图UNIT ANYUNIT SSD
memory-首选项
读取语法图跳过可视语法图KEEP IN MEMORY NOYES
column-definition
读取语法图跳过可视语法图列名FORCOLUMN系统列名数据类型3 缺省子句生成的-子句FIELDPROC外部程序名(,常量)NOT NULLNOT HIDDENIMPLICITLY HIDDENdatalink-选项41
数据类型
读取语法图跳过可视语法图内置类型单值类型名称
注:
  • 1 不能多次指定同一子句。
  • 2 可选条款可以按任何顺序指定。
  • 3 数据类型 对于行更改时间戳记列, 行开始列和行结束列以及事务开始标识列是可选的。
  • 4 只能为 DATALINKs 和源自 DATALINKs 的单值类型指定 datalink-options。
内置类型
读取语法图跳过可视语法图SMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)(整数,0,整数)FLOAT(53)(整数)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)(整数)CHARACTERCHARVARYINGVARCHAR(整数)分配子句FOR BIT DATAFOR SBCS DATAFOR MIXED DATAccsid-子句CHARACTERCHARLARGE OBJECTCLOB(1M)(整数KMG)分配子句FOR SBCS DATAFOR MIXED DATAccsid-子句GRAPHIC(1)(整数)GRAPHIC VARYINGVARGRAPHIC(整数)分配子句DBCLOB(1M)(整数KMG)分配子句ccsid-子句NATIONAL CHARACTERNATIONAL CHARNCHAR(1)(整数)NATIONAL CHARACTERNATIONAL CHARNCHARVARYINGNVARCHAR(整数)分配子句NATIONAL CHARACTERNCHARLARGE OBJECTNCLOB(1M)(整数KMG)分配子句Normalize-子句BINARY(1)(整数)BINARY VARYINGVARBINARY(整数)分配子句BLOBBINARY LARGE OBJECT(1M)(整数KMG)分配子句DATETIME(0)TIMESTAMP(6)(整数)DATALINK(200)(整数)分配子句ccsid-子句XMLccsid-子句BOOLEAN
ccsid-子句
读取语法图跳过可视语法图CCSID整数Normalize-子句
normalize-子句
读取语法图跳过可视语法图NOT NORMALIZEDNORMALIZED
allocate-子句
读取语法图跳过可视语法图ALLOCATE(整数)
缺省子句
读取语法图跳过可视语法图WITHDEFAULT 常量USERNULLCURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP(6)(整数)铸造函数名称(常量USERCURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP(6)(整数))
已生成-子句
读取语法图跳过可视语法图GENERATEDALWAYSBY DEFAULT1identity-选项as-row-change-timestamp-子句GENERATEDALWAYSas-row-transaction-timestamp-子句as-row-transaction-start-id-子句as-generated-expression-子句
注:
  • 仅当列具有 ROWID 数据类型 (或基于 ROWID 数据类型的单值类型) ,列是标识列或列是行更改时间戳记时,才能指定 1 GENERATED。
身份选项
读取语法图跳过可视语法图AS IDENTITY (START WITH1数字常量INCREMENT BY1数字常量NO MINVALUEMINVALUE数字常量NO MAXVALUEMAXVALUE数字常量NO CYCLECYCLECACHE20NO CACHECACHE整数NO ORDERORDER1)
注:
  • 1 不能多次指定同一子句。
as-row-change-timestamp-子句
读取语法图跳过可视语法图FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
as-row-transaction-timestamp-子句
读取语法图跳过可视语法图AS ROW BEGINSTARTEND
as-row-transaction-start-id-clause
读取语法图跳过可视语法图AS TRANSACTION START ID
as-generated-expression-子句
读取语法图跳过可视语法图AS(非确定性表达式 )
非确定性表达式
读取语法图跳过可视语法图DATA CHANGE OPERATIONspecial-register内置全局变量
special-register
读取语法图跳过可视语法图CURRENT CLIENT_ACCTNGCURRENT CLIENT_APPLNAMECURRENT CLIENT_PROGRAMIDCURRENT CLIENT_USERIDCURRENT CLIENT_WRKSTNNAMECURRENT SERVERSESSION_USERUSER
内置全局变量
读取语法图跳过可视语法图QSYS2.JOB_NAMEQSYS2.SERVER_MODE_JOB_NAMESYSIBM.CLIENT_HOSTSYSIBM.CLIENT_IPADDRSYSIBM.CLIENT_PORTSYSIBM.PACKAGE_NAMESYSIBM.PACKAGE_SCHEMASYSIBM.PACKAGE_VERSIONSYSIBM.ROUTINE_SCHEMASYSIBM.ROUTINE_SPECIFIC_NAMESYSIBM.ROUTINE_TYPE
句点定义
读取语法图跳过可视语法图PERIODFORSYSTEM_TIME (begin-column-name,结束列名称 )
数据链路-选项
读取语法图跳过可视语法图LINKTYPE URLNO LINK CONTROL
复制选项
读取语法图跳过可视语法图EXCLUDING IDENTITYCOLUMN ATTRIBUTESINCLUDING IDENTITYCOLUMN ATTRIBUTESEXCLUDINGCOLUMNDEFAULTSINCLUDINGCOLUMNDEFAULTSUSING TYPE DEFAULTSEXCLUDING IMPLICITLY HIDDEN COLUMN ATTRIBUTESINCLUDING IMPLICITLY HIDDEN COLUMN ATTRIBUTESEXCLUDING ROW CHANGE TIMESTAMP COLUMN ATTRIBUTESINCLUDING ROW CHANGE TIMESTAMP COLUMN ATTRIBUTES1
as-result-table
读取语法图跳过可视语法图(列名FORCOLUMN系统列名)AS(SELECT 语句 ) WITH NO DATAWITH DATA copy-选项
注:
  • 1 可以按任何顺序指定这些子句。

描述

表名
命名临时表。 如果明确指定了限定符,那么该限定符必须是 SESSION ,否则将返回错误。 如果未指定限定符,那么会将其隐式定义为 SESSION。 如果已声明的临时表或依赖于已声明的临时表的索引或视图已存在,那么将返回错误。

如果已存在具有相同名称和模式名称 SESSION 的持久表,视图,索引或别名:

  • 声明的临时表仍使用 SESSION.table-name定义。 由于声明的临时表名的解析不包含永久库,因此未发出错误。
  • 对 SESSION.table-name 的任何引用都将解析为已声明的临时表,而不是名称为 SESSION.table-name的永久表,视图,索引或别名。

将在库 QTEMP 中创建表。

系统名称 系统对象标识符
标识表的 system-object-identifiersystem-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 的列)
  • “行更改时间戳记”列
  • “行开始”列
  • “行结束”列
  • “事务开始标识”列
  • 所生成的表达式列
对于 XML 列,除非指定了 NOT NULL ,否则缺省值为 NULL; 在这种情况下,没有缺省值。
如果未在 DEFAULT 关键字后面指定值,那么:
  • 如果该列可空,那么缺省值为空值。
  • 如果该列不可为空,那么缺省值取决于该列的数据类型:
    数据类型 缺省值
    数字 0
    定长字符或图形字符串 空白
    定长二进制字符串 十六进制零
    变长字符串 (varying-length string) 字符串长度 0
    日期 INSERT 时的当前日期
    时间 INSERT 时的当前时间
    布尔值 布尔值 FALSE
    Datalink 与 DLVALUE('',' URL ','') 相对应的值
    单值类型 单值类型的相应源类型的缺省值。

列定义 中省略 NOT NULL 和 DEFAULT 是 DEFAULT NULL 的隐式规范。

常量
将常量指定为列的缺省值。 指定的常量必须表示可根据分配规则分配给列的值,如 分配和比较中所述。 浮点常量或十进制浮点常量不得用于 SMALLINT , INTEGER , DECIMAL 或 NUMERIC 列。 十进制常量不得在小数点右边包含比列的指定小数位更多的数字。 开始更改对于 BOOLEAN 列,只能使用 BOOLEAN 常量 TRUE 和 FALSE。结束更改
用户
指定 INSERT 或 UPDATE 时 USER 专用寄存器的值作为列的缺省值。 列的数据类型必须是 CHAR 或 VARCHAR ,其长度属性必须大于或等于 USER 专用寄存器的长度属性。
指定空值作为列的缺省值。 如果指定了 NOT NULL ,那么不得在同一 列定义中指定 DEFAULT NULL。
CURRENT_DATE
将当前日期指定为列的缺省日期。 如果指定 CURRENT_DATE ,那么列的数据类型必须是 DATE 或基于 DATE 的单值类型。
current_time
将当前时间指定为列的缺省时间。 如果指定 CURRENT_TIME ,那么列的数据类型必须是 TIME 或基于 TIME 的单值类型。
CURRENT_TIMESTAMP 或 CURRENT_TIMESTAMP (整数)
将当前时间戳记指定为列的缺省时间戳记。 如果指定了 CURRENT_TIMESTAMP ,那么列的数据类型必须是 TIMESTAMP 或基于 TIMESTAMP 的单值类型。 用作缺省值的 CURRENT_TIMESTAMP 专用寄存器的时间戳记精度将始终与列的时间戳记精度匹配,而不考虑为专用寄存器指定的精度。
铸造函数名称
此格式的缺省值只能用于定义为 强类型 单值类型的列, BINARY , VARBINARY , BLOB , CLOB , DBCLOB , DATE , TIME 或 TIMESTAMP 数据类型。 下表描述了允许使用这些 强制类型转换函数
数据类型 强制类型转换函数名
强类型 单值类型 N (基于 BINARY , VARBINARY , BLOB , CLOB 或 DBCLOB) BINARY , VARBINARY , BLOB , CLOB 或 DBCLOB *
基于 DATE , TIME 或 TIMESTAMP 的 强类型 单值类型 N N (创建 N 时生成的用户定义的强制类型转换函数) **

DATE , TIME 或 TIMESTAMP *
基于其他数据类型的 强类型 单值类型 N N (创建 N 时生成的用户定义的强制类型转换函数) **
BINARY , VARBINARY , BLOB , CLOB 或 DBCLOB BINARY , VARBINARY , BLOB , CLOB 或 DBCLOB *
DATE , TIME 或 TIMESTAMP DATE , TIME 或 TIMESTAMP *
注:

* 函数的名称必须与具有隐式或显式模式名称 QSYS2的数据类型 (或单值类型的源类型) 的名称匹配。

** 函数的名称必须与列的单值类型的名称匹配。 如果使用模式名称进行限定,那么它必须与单值类型的模式名称相同。 如果未限定,那么来自函数解析的模式名称必须与单值类型的模式名称相同。

常量
指定常量作为自变量。 对于单值类型的源类型或数据类型 (如果不是单值类型) ,常量必须符合常量的规则。 对于 BINARY , VARBINARY , BLOB , CLOB , DBCLOB , DATE , TIME 和 TIMESTAMP 函数,常量必须是字符串常量。
用户
指定 INSERT 或 UPDATE 时 USER 专用寄存器的值作为列的缺省值。 列的单值类型的源类型的数据类型必须是长度属性大于或等于 USER 专用寄存器的长度属性的 CHAR 或 VARCHAR。
CURRENT_DATE
将当前日期指定为列的缺省日期。 如果指定 CURRENT_DATE ,那么列的单值类型的源类型的数据类型必须为 DATE。
current_time
将当前时间指定为列的缺省时间。 如果指定 CURRENT_TIME ,那么列的单值类型的源类型的数据类型必须是 TIME。
CURRENT_TIMESTAMP 或 CURRENT_TIMESTAMP (整数)
将当前时间戳记指定为列的缺省时间戳记。 如果指定了 CURRENT_TIMESTAMP ,那么列的单值类型的源类型的数据类型必须为 TIMESTAMP。 用作缺省值的 CURRENT_TIMESTAMP 专用寄存器的时间戳记精度将始终与列的时间戳记精度匹配,而不考虑为专用寄存器指定的精度。

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

已生成
指定数据库管理器为列生成值。 如果要将列视为下列其中一种类型的列,那么可以指定 GENERATED:
  • 标识列
  • “行更改时间戳记”列

如果要将列视为下列其中一种类型的列,那么必须指定 GENERATED:

  • “行开始”列
  • “行结束”列
  • “事务开始标识”列
  • 所生成的表达式列
如果列的数据类型是 ROWID (或基于 ROWID 的单值类型) ,那么也可以指定该值。 否则,不得对其进行指定。 不能在列定义中使用 default-clause 指定 GENERATED。
ALWAYS
指定当插入或更新行并且必须生成缺省值时,数据库管理器将始终为该列生成值。 “总是”是建议的值。
BY DEFAULT
指定在插入或更新行时,数据库管理器将为列生成值,除非指定了显式值,否则必须生成缺省值。

对于标识列或行更改时间戳记列,数据库管理器会插入或更新指定的值,但不会验证它是否是该列的唯一值,除非标识列或行更改时间戳记列具有唯一约束或唯一索引 (仅指定标识列或行更改时间戳记列)。

作为身份
指定该列是表的标识列。 一个表只能有一个标识列。 仅当列的数据类型是标度为零的精确数字类型 (SMALLINT , INTEGER , BIGINT , DECIMAL 或 SCALE 为零的 NUMERIC 或基于其中一种数据类型的单值类型) 时,才能指定 aS IDENTITY。 如果指定了 DECIMAL 或 NUMERIC 数据类型,那么精度不得大于 31。

标识列隐式为 NOT NULL。 标识列不能具有 DEFAULT 子句。 请参阅 CREATE TABLE 中的 AS IDENTITY 子句以获取身份属性的描述。

对于更新时的每行,作为行更改时间戳记
指定列是时间戳记,并且值将由数据库管理器生成。 当插入一行时,数据库管理器会为每行生成一个列值,并为更新了任何列的每行生成一个值。 为行更改时间戳记列生成的值是对应于行插入或更新时间的时间戳记。 如果使用单个 SQL 语句插入多行,那么每行的行更改时间戳记列的值可能不同,以反映插入每行的时间。 不保证生成的值唯一。
一个表只能有一个行更改时间戳记列。 如果指定了 数据类型 ,那么它必须是 TIMESTAMP 精度为 6 或基于 TIMESTAMP 精度为 6的单值类型。 行更改时间戳记列不能具有 DEFAULT 子句,并且必须为 NOT NULL。
即行开始
指定列包含时间戳记数据,并且值由数据库管理器生成。 在插入行时,数据库管理器会为每行生成一个列值,并为更新了任何列的每行生成一个值。 生成的值是对应于与最新事务关联的开始时间的时间戳记。 如果使用单个 SQL 语句插入多行,那么每行的事务开始时间戳记列的值相同。
对于系统时间段时态表,数据库管理器确保跨事务的行开始列的生成值的唯一性。 可以调整时间戳记值,以确保插入到关联历史记录表中的行的结束时间戳记值大于开始时间戳记值。 当有冲突的事务正在更新系统时间段时态表中的同一行时,可能会发生此情况。 必须将 SYSTIME_PERIOD_ADJ QAQQINI 选项设置为*已对要发生的时间戳记值进行此调整。 如果在单个 SQL 事务中插入或更新了多行,并且不需要进行调整,那么行开始列的值对于所有行都是相同的,并且与为另一个事务的列生成的值是唯一的。 需要行开始列作为 SYSTEM_TIME 时间段的开始列。
一个表只能有一个行开始列。 如果未指定 data-type ,那么该列将定义为 TIMESTAMP (12)。 如果指定了 data-type ,那么它必须是 TIMESTAMP (12)。 该列不能具有 DEFAULT 子句,并且必须定义为 NOT NULL。 行开始列不可更新。
AS 行结束
指定每当插入行或更新行中的任何列时,数据库管理器都将指定该列的数据类型的值。 分配的值为 TIMESTAMP "9999-12-30-00.00.00.000000000000"。
需要行结束列作为 SYSTEM_TIME 时间段的第二列
一个表只能有一个行结束列。 如果未指定 data-type ,那么该列定义为 TIMESTAMP (12)。 如果指定了 data-type ,那么它必须是 TIMESTAMP (12)。 该列不能具有 DEFAULT 子句,并且必须定义为 NOT NULL。 行结束列不可更新。
AS 事务启动标识
指定每当将行插入到表中或更新行中的任何列时,数据库管理器都将指定该值。 数据库管理器为每个事务分配唯一的时间戳记值或空值。 如果该列可空,并且表中存在不需要调整其值的行开始列,那么会将空值分配给 transaction-start-ID 列。 否则,在执行事务中的第一个数据更改语句期间,将使用时间时钟读数生成该值,该值要求将值分配给表中的行开始列或事务开始标识列,或者删除系统时间段时态表中的行。 如果在单个 SQL 事务中插入或更新多行,那么对于所有行, transaction-start-ID 列的值相同,并且与为另一个事务的列生成的值相同。
系统周期时态表需要 transaction-start-ID 列。
一个表只能有一个 transaction-start-ID 列。 如果未指定 data-type ,那么该列定义为 TIMESTAMP (12)。 如果指定了 data-type ,那么它必须是 TIMESTAMP (12)。 transaction-start-ID 列不能具有 DEFAULT 子句。 事务启动标识列不可更新。
数据更改操作
指定当使用 ON DELETE ADD EXTRA ROW 定义历史记录表时,数据库管理器将为插入的每行,更新任何列的每行以及从系统时间段时态表中删除的所有行生成一个值。 该列将包含下列其中一个值:
I
插入操作
U
更新操作
D
删除操作
如果未指定 data-type ,那么该列定义为 CHAR (1)。 如果指定了 data-type ,那么它必须是 CHAR (1)。 该列不能具有 DEFAULT 子句或字段过程。
专用寄存器
指定当使用 ON DELETE ADD EXTRA ROW 定义历史记录表时,由数据库管理器为插入的每一行,更新任何列的每一行以及从系统时间段时态表中删除的所有行分配专用寄存器的值。 使用数据更改语句时专用寄存器的值。 如果使用单个 SQL 语句更改了多行,那么对于所有行,该列的值都将相同。
必须根据下表定义 data-type :
专用寄存器 列的数据类型
CURRENT CLIENT_ACCTNG VARCHAR(255)
CURRENT CLIENT_APPLNAME VARCHAR(255)
当前客户机程序标识 VARCHAR(255)
CURRENT CLIENT_USERID VARCHAR(255)
CURRENT CLIENT_WRKSTNNAME VARCHAR(255)
当前服务器 VARCHAR(18)
SESSION_USER VARCHAR(128)
用户 VARCHAR(18)
该列不能具有 DEFAULT 子句或字段过程。
内置全局变量
指定数据库管理器为插入的每行,更新了任何列的每行以及定义了 ON DELETE ADD EXTRA ROW 的历史记录表时从系统时间段时态表中删除的所有行指定内置全局变量的值。 使用数据更改语句时内置全局变量的值。 如果使用单个 SQL 语句更改了多行,那么对于所有行,该列的值都将相同。
必须根据下表定义 data-type :
内置全局变量 (built-in global variable) 列的数据类型
QSYS2.JOB_NAME VARCHAR (28)
QSYS2.SERVER_MODE_JOB_NAME VARCHAR (28)
SYSIBM.CLIENT_HOST VARCHAR(255)
SYSIBM.CLIENT_IPADDR VARCHAR(128)
SYSIBM.CLIENT_PORT INTEGER
SYSIBM.PACKAGE_NAME VARCHAR(128)
SYSIBM.PACKAGE_SCHEMA VARCHAR(128)
SYSIBM.PACKAGE_VERSION VARCHAR(64)
SYSIBM.ROUTINE_SCHEMA VARCHAR(128)
SYSIBM.ROUTINE_SPECIFIC_NAME VARCHAR(128)
SYSIBM.ROUTINE_TYPE CHAR (1)
该列不能具有 DEFAULT 子句或字段过程。
字段 PROC
external-program-name 指定为列的字段过程出口例程。 它必须是不包含 SQL 的 ILE 程序。 它不能是服务程序。
字段过程对列值进行编码和解码。 在列中插入值之前,会将其传递到字段过程以进行编码。 在使用列中的值之前,会将其传递到字段过程以进行解码。
在处理 CREATE TABLE 语句期间也会调用该字段过程。 调用此过程时,该过程会向 Db2 提供该列的字段描述。 字段描述定义编码值的数据特征。 相比之下,为 CREATE TABLE 语句中的列提供的信息定义了解码值的数据特征。
常量
指定在调用字段过程时传递给该过程的参数。 参数列表是可选的。
不能为作为 ROWID 或 DATALINK 或基于 ROWID 或 DATALINK 的单值类型的列定义字段过程。 该列不得是标识列,行更改时间戳记列, 行开始列,行结束列,事务开始标识列或生成的表达式列。 该列不得具有缺省值 CURRENT DATE , CURRENT TIME , CURRENT TIMESTAMP 或 USER。 无法在检查条件中引用该列。 如果它是外键的一部分,那么相应的父键列必须使用相同的字段过程。 请参阅 嵌入式 SQL 编程 主题集合以获取字段过程的示例。
NOT NULL
阻止列包含空值。 省略 NOT NULL 意味着列可以为空。 行更改时间戳记列, 行开始列和行结束列需要 NOT NULL。
未隐藏
指示列包含在 SQL 语句中对表的隐式引用中。 这是缺省情况。
隐式隐藏
指示除非通过名称明确引用某列,否则该列在 SQL 语句中不可视。 例如,SELECT * 的结果中不会包含任何隐藏列。 一个表必须至少包含一个未隐式隐藏的列。
datalink-options
指定与 DATALINK 数据类型关联的选项。
链接类型 URL
将链接类型定义为统一资源定位符(URL)。
无链路控制
指定将不进行任何检查以确定链接的文件是否存在。 只检查 URL 的语法。 没有对链接文件的数据库管理器控制。
时间段定义
期间
定义表的句点。
SYSTEM_TIME (begin-column-nameend-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-nameview-name
指定在指定表或视图中定义的列包含在此表中。 在 LIKE 子句中指定的 table-nameview-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-statementtable-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-statementtable-name生成的列的缺省值。 或 view-name。 缺省值是在 INSERT 上未指定值时对列指定的值。

如果指定了 USING TYPE DEFAULTS ,请勿指定 INCLUDING COLUMN DEFAULTS。

如果未指定 INCLUDING COLUMN DEFAULTS ,那么不会继承缺省值。

使用类型缺省值
指定表的缺省值取决于由 select-statementtable-name生成的列的数据类型。 或 view-name。 如果列可空,那么缺省值为空值。 否则,缺省值如下所示:
数据类型 缺省值
数字 0
定长字符或图形字符串 空白
定长二进制字符串 十六进制零
变长字符串 (varying-length string) 字符串长度 0
日期 INSERT 时的当前日期
时间 INSERT 时的当前时间
时间戳记 INSERT 时的当前时间戳记
Datalink 与 DLVALUE('',' URL ','') 相对应的值
单值类型 单值类型的相应源类型的缺省值。

如果指定了 INCLUDING COLUMN DEFAULTS ,请勿指定 USING TYPE DEFAULTS。

包括隐式隐藏列属性 排除隐式隐藏列属性
指定是否继承隐式隐藏列。
包含隐式隐藏列属性
指定表从 select-statementtable-name继承隐式隐藏列。 或 view-name ,这些列将使用新表中隐式隐藏的属性进行定义。

如果未指定 INCLUDING 隐式隐藏列属性,那么表将没有任何隐式隐藏列。

排除隐式隐藏列属性
指定表不继承 fullselect table-name中隐式隐藏的列。 或 view-name
包括行更改时间戳记列属性 排除行更改时间戳记列属性
指定是否继承行更改时间戳记属性。
包括行更改时间戳记列属性
指定表继承由 select-statementtable-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-tableselect-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的隐式限定符。