CREATE EXTERNAL TABLE 语句
虽然表通常驻留在数据库中,但外部表驻留在基于文本的定界文件,或在数据库外部的固定长度格式文件中中。
- 将数据存储在数据库外部,同时保留查询该数据的能力。 要将数据从数据库卸载到外部文件中,请在下列其中一个 SQL 语句中将外部表指定为目标表:
- INSERT SQL
- SELECT INTO SQL
- 创建外部表作为 SELECT SQL
- 将数据从外部文件装入到数据库中的表中。 您可以执行诸如强制转换、连接和删除列之类的操作,以在装入期间处理数据。 要将数据从外部表装入到数据库中,请像对任何其他表一样在 SELECT SQL 语句中使用 FROM 子句。
- 将数据传输到另一个应用程序。
将外部表用于“抽取-变换-装入”(ETL) 过程的一个优点是可以使用纯 SQL 来执行这些过程。 由于可以从任何 SQL 客户机启动基于 SQL 的 ETL 过程,因此不需要使用特殊 ETL 工具。
- 指定的
- 外部表具有类似于正常表的名称和目录条目。
- 瞬态
- 外部表具有系统生成的格式为
SYSTET<number>的名称,并且没有商品目录条目。 例如,系统可能创建一个瞬态外部表来保存查询结果。 这样一个表的生存期是查询的持续时间。
调用
此语句可以嵌入在应用程序中,也可以使用动态 SQL 语句发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。
授权
- CREATETAB 权限
- 下列其中一项特权或权限:
- 对表空间的 USE 特权
- SYSADM 权限
- SYSCTRL 权限
- 下列其中一项特权或权限:
- 数据库上的 IMPLICIT_SCHEMA 权限(如果表的隐式或显式模式名称不存在)
- 对模式的 CREATEIN 特权(如果该表的模式名称引用了现有模式)
- 对模式的 SCHEMAADM 权限(如果该表的模式名称引用现有模式)
- 该授权标识必须与表层次结构的根表的所有者相同。
- 该授权标识所具有的特权必须包括对包含表层次结构的根表的模式的 SCHEMAADM 权限。
- 由授权标识所具有的特权必须包含 DBADM 权限。
语法
此语句的语法取决于要创建的外部表的性质:- 请使用以下语法在目录中为新的外部表创建表定义。 指定表名称是必需的,因此生成的外部表是指定的表。 必须指定 DATAOBJECT 或 FILE_NAME 选项以标识目标文件。
- 使用以下语法来将现有表用作新外部表的模板,并使用源表的内容填充该表。 如果此语句显式指定表名,那么生成的外部表是命名表;否则,生成的外部表是瞬态表。 该文件名必须由
file-name参数或 DATAOBJECT 或 FILE_NAME 选项指定。
描述
- table-name
- 这是外部表的名称。 该名称(包括隐式或显式限定符)不得标识已在目录中描述的表、视图、昵称或别名。 模式名不能为 SYSIBM、SYSCAT、SYSFUN 或 SYSSTAT (SQLSTATE 42939)。 file-name
- 要包含要创建的外部表的文件(或任何可被视为文件的介质)的标准名称。 如果指定了此参数,那么不能指定 DATAOBJECT 或 FILE_NAME 选项。 column-definition
- 定义列的属性。
- 列名称
- 指定表列。 名称不能限定,并且同一名称不能用于表的多列 (SQLSTATE 42711)。 内置类型
- 下列其中一种内置数据类型:
- SMALLINT
- 一个小整数。
- [ 整数 | 整数 ]
- 一个大整数。
- BIGINT
- 一个大整数。
- [DECIMAL | DEC | NUMERIC | NUM] (precision-integer, scale-integer)
- 十进制数字。
- 精度整数指定总数字数。 它必须在 1 - 31 范围内。 缺省值为 5。
- 小数位整数指定小数点右边的数字位数。 不能为负数,也不能超过精度。 缺省值为 0。
- FLOAT(integer)
- 单精度浮点数或双精度浮点数。 如果指定的长度在以下范围内:
- 1 - 24,数字使用单精度
- 25 - 53,该数字使用双精度
您可以指定以下内容而不是 FLOAT:- REAL
- 用于单精度浮点。
- 双
- 对于双精度浮点数。
- DOUBLE PRECISION
- 对于双精度浮点数。
- FLOAT
- 对于双精度浮点数。
- DECFLOAT(precision-integer)
- 一个十进制浮点数。 精度整数指定数字的总数,可以是 16 或 34。 缺省值为 34。
- [CHARACTER | CHAR](integer [OCTETS | CODEUNITS32])
- 指定的代码单元数的固定长度字符串。 此数字范围可以在 1 到 255 OCTETS 或从 1 到 63 CODEUNITS32。 缺省值为 1。
- [VARCHAR | CHARACTER VARYING | CHAR VARYING](integer [OCTETS | CODEUNITS32])
- 一个可变长度字符串,其最大长度为指定的代码单元数。 此数字的范围可以从 1 到 32672 OCTETS 或从 1 到 8168 CODEUNITS32。
- FOR BIT DATA
- 指定将列的内容视为位(二进制)数据。 与其他系统进行数据交换期间,不执行代码页转换。 比较以二进制进行,与数据库整理顺序无关。
- [CLOB | CHARACTER LARGE OBJECT | CHAR LARGE OBJECT] (integer [K] [OCTETS | CODEUNITS32])
- 最大长度为指定代码单元数的字符大对象字符串。 缺省最大长度为 65,535 字节。如果要将长度整数乘以 1024 ,请指定 K (千) 乘数。
- 无论您是否使用 K 乘数,生成的长度都受外部表中 CLOB 列 (即 65,535 OCTETS , 32,767 CODEUNITS16或 16,383 CODEUNITS32) 的最大长度限制。 请注意,64K OCTETS 和 16K CODEUNITS32 各超出一个最大长度,因此不允许使用。
- 在数据类型与长度规范之间或长度整数与 K 乘数之间允许任何数目的空格 (包括零个空格)。 例如,以下规范都是等效且有效的:
CLOB(50K) CLOB(50 K) CLOB (50 K) - 可以大写或小写指定 K 乘数。
在 Unicode 数据库中,字符串数据类型的缺省字符串单位由 NLS_STRING_UNITS 全局变量或 string_units 数据库配置参数的值确定。 在非 Unicode 数据库中,用于字符串数据类型的缺省字符串单元是 OCTETS。
- OCTETS
- 指定长度属性的单位是字节。
- CODEUNITS32
- 指定长度属性的单位是 Unicode UTF-32 代码单位,它近似于以字符计的计数。 这不会影响数据类型的底层代码页。 通过对 UTF-32 代码单元进行计数来确定数据值的实际长度,就像数据已转换为 UTF-32 一样。 仅在 Unicode 数据库中,才可指定 CODEUNITS32 (SQLSTATE 560AA)。
- GRAPHIC (integer [ CODEUNITS16 | CODEUNITS32 ])
- 指定长度的固定长度图形字符串,长度范围为 1 - 127 双字节、1 - 127 CODEUNITS16 或 1 - 63 CODEUNITS32。 默认长度为 1。
- VARGRAPHIC(integer [CODEUNITS16 | CODEUNITS32])
- 指定最大长度的可变长度图形字符串,范围可以从 1 到 16336 个双字节,1 到 16336 CODEUNITS16 或 1 到 8168 CODEUNITS32。
- DBCLOB (integer [K] [CODEUNITS16 | CODEUNITS32])
- 以双字节、Unicode UTF-16 代码单位或 Unicode UTF-32 代码单位表示的字符大对象字符串,其最大长度为指定长度。 缺省最大长度为 32,767 个双字节。如果要将长度整数乘以 1024 ,请指定 K (千) 乘数。
- 无论您是否使用 K 乘数,生成的长度都由外部表中 DBCLOB 列的最大长度限制,即 32,767 CODEUNITS16 或 16,383 CODEUNITS32。 请注意, 32K CODEUNITS16 和 16K CODEUNITS32 都比最大长度超出一个,因此不允许使用。
- 在数据类型与长度规范之间或长度整数与 K 乘数之间允许任何数目的空格 (包括零个空格)。 例如,以下规范都是等效且有效的:
DBCLOB(50K) DBCLOB(50 K) DBCLOB (50 K) - 可以大写或小写指定 K 乘数。
在 Unicode 数据库中,字符串数据类型的缺省字符串单位由 NLS_STRING_UNITS 全局变量或 string_units 数据库配置参数的值确定。 在非 Unicode 数据库中,用于字符串数据类型的缺省字符串单位是 CODEUNITS16。
- CODEUNITS16
- 指定长度属性的单位为 Unicode UTF-16 代码单位,这与以双字节为单位进行计数相同。 CODEUNITS16 只能在 Unicode 数据库中指定 (SQLSTATE 560AA)。
- CODEUNITS32
- 指定长度属性的单位是 Unicode UTF-32 代码单位。 这不会影响数据类型的底层代码页。 通过对 UTF-32 代码单元进行计数来确定数据值的实际长度,就像数据已转换为 UTF-32 一样。 仅在 Unicode 数据库中,才可指定 CODEUNITS32 (SQLSTATE 560AA)。
- [NATIONAL CHARACTER | NATIONAL CHAR | NCHAR](integer)
- 具有指定长度的固定长度字符串。 默认长度为 1。
NATIONAL CHARACTER 类型映射到固定长度字符或固定长度图形字符串,这取决于 nchar_mapping 数据库配置参数的值,该配置参数还定义了字符串单位。
- [NATIONAL CHARACTER VARYING | NATIONAL CHAR VARYING | NCHAR VARYING | NVARCHAR](integer)
- 指定最大长度的变长字符串。
NATIONAL CHARACTER VARYING 类型映射到可变长度字符或可变长度图形字符串,具体取决于 nchar_mapping 数据库配置参数的值,该参数还定义字符串单位。
- [NATIONAL CHARACTER LARGE OBJECT | NCHAR LARGE OBJECT | NCLOB] (整数 [K])
- 具有指定最大长度的大对象字符串。 缺省最大长度为 16,383 个双字节。
此数据类型映射到字符大对象 (CLOB) 或双字节字符大对象 (DBCLOB),具体取决于 nchar_mapping 数据库配置参数的当前值,该参数还定义字符串单位。 请参阅 CLOB 或 DBCLOB 参数 (以适用者为准) 的描述,以获取有关长度整数的可能值以及如何使用 K (千) 乘数的信息。
- BINARY(integer)
- 指定长度的固定长度二进制字符串,必须在 1-255 个字节的范围内。 默认长度为 1。
- [VARBINARY | BINARY VARYING](integer)
- 指定最大长度的可变长度二进制,必须在 1 到 32672 个字节的范围内。
- [BLOB | BINARY LARGE OBJECT] (整数 [K])
- 一个二进制大对象字符串,其最大长度为指定的代码单元数。 缺省最大长度为 65,535 字节。如果要将长度整数乘以 1024 ,请指定 K (千) 乘数。
- 无论您是否使用 K 乘数,生成的长度都由外部表中 BLOB 列的最大长度 (即 65,535 字节) 限制。 请注意,64K 超出最大长度 1,因此是不允许的。
- 在数据类型与长度规范之间或长度整数与 K 乘数之间允许任何数目的空格 (包括零个空格)。 例如,以下规范都是等效且有效的:
BLOB(50K) BLOB(50 K) BLOB (50 K) - 可以大写或小写指定 K 乘数。
- 日期
- 日期。
- 时间
- 时间。
- TIMESTAMP(integer) 或 TIMESTAMP
- 时间戳记。 整数指定小数的小数位数,从 0(秒)到 12(皮秒)。 缺省值为 6(微秒)。
- 布尔值
- 布尔值。
- LIKE table-name1 or view-name or nickname
- 指定表中的列与指定表 (table-name1) 、视图 (视图名称) 或昵称 (昵称) 中的列具有相同的名称和描述。 指定的表、视图或昵称必须存在于目录中,或者必须是已声明的临时表。 不能指定类型化表或类型化视图 (SQLSTATE 428EC)。使用 LIKE 表示隐式定义 N 列,其中 N 是所标识的表(包括隐式隐藏的列)、视图或昵称中的列数。 对应于现有表中隐式隐藏列的新表列也将被定义为隐式隐藏。 隐式定义取决于在 LIKE 之后指定的内容:
- 如果指定了一个表,则隐式定义包括该表的每个列的列名、数据类型、隐藏属性和可空性特征。 如果未指定 EXCLUDING COLUMN DEFAULTS,那么还包括列缺省值。
- 如果指定了视图,则隐式定义包括该视图中定义的全查询的每个结果列的列名、数据类型和可空性特征。 视图列的数据类型必须是对表列有效的数据类型。
- 如果指定了昵称,则隐式定义包含该昵称的每一列的列名、数据类型和可空性特征。
- 如果指定了受保护表,则新表将继承与所标识表相同的安全策略和受保护列。
- 如果指定了一个表,并且该表包含行起始列、行结束列或事务起始标识列,则新表的相应列仅继承源列的数据类型。 新列不被视为生成列。
- 如果指定了包含时间段的表,那么新表将不继承时间段定义。
- 如果指定了系统周期临时表,那么新表不是系统周期临时表。
- 如果指定了使用随机(通过生成)方法的随机分布表,并且正在创建的新表不共享相同的表分布,则不包括用于生成随机分布值的 RANDOM_DISTRIBUTION_KEY 列。
可以根据 copy-attributes 子句来包含或排除列缺省属性。 隐式定义不包括指定的表、视图或昵称的任何其他属性。 因此,新表没有任何主键、唯一约束、外键约束、引用完整性约束、触发器、索引、ORGANIZE BY 规范或 PARTITIONING KEY 规范。
如果在 LIKE 子句中标识了一个表并且该表包含 ROW CHANGE TIMESTAMP 列,那么新表的对应列仅继承 ROW CHANGE TIMESTAMP 列的数据类型。 不会将新列视为生成的列。
如果指定了一个表,并且对该表激活了行或列级别访问控制,那么新表不会继承该表。
- 选项
- 以下选项控制将数据装入到外部表文件或从外部表文件中检索数据。 每个选项的值都是一个文本字符串,并且不区分大小写。
- 二进制数
- 指定以二进制格式输入数字数据,而不是以 ASCII 字符表示法输入数字数据。 不影响其他非数字数据。 仅支持使用文本格式的固定长度格式数据。
- TRUE 或 ON
必须以二进制格式输入数字数据 (DECIMAL 类型除外)。
支持的数字类型为 SMALLINT , INT , BIGINT , REAL 和 DOUBLE。 不会在数据类型之间进行转换,但在整数类型 (SMALLINT , INT 和 BIGINT) 之间进行的转换除外。
数据长度必须与其目标列定义相匹配 (整数转换除外; 例如, 2 , 4 和 8 字节都是 BIGINT 列的有效区域长度)。
假定数据文件中的所有数字输入都是大尾数法,而不考虑运行装入操作的平台。
REAL 和 DOUBLE 值必须采用 IEEE 浮点格式。
- FALSE 或 OFF
- 必须以标准 ASCII 字符表示法输入数字数据。
- BOOLSTYLE 或 BOOLEAN_STYLE
- 在装入操作期间,所有布尔值都必须使用相同的样式。 此选项指定要使用的 Boolean 样式:
- 1_0(这是缺省值)
- T_F
- Y_N
- YES_NO
- TRUE_FALSE
- CARDINALITY
- 非零正整数值,用于覆盖对预期返回行数的估算。
- CCSID
- 输入数据文件中的编码字符集标识 (CCSID)。 该值可以是 CCSID 规范中的任何有效整数值。 没有缺省值。 当 ENCODING 选项的值为 UTF8, LATIN9或 INTERNAL 时, CCSID 和 ENCODING 选项互斥。哪些样式用于日期和时间,取决于是否指定了 CCSID:
- 如果指定了 CCSID,并且未指定 DATESTYLE、TIMESTYLE、DATEDELIM 或 TIMEDELIM,那么将使用 DATE_FORMAT、TIME_FORMAT 和 TIMESTAMP_FORMAT 的值或缺省值。
- 如果未指定 CCSID,并且未指定 TIMESTAMP_FORMAT、DATE_FORMAT 或 TIME_FORMAT,那么将使用 DATESTYLE、TIMESTYLE、DATEDELIM 和 TIMEDELIM 的值或缺省值。
- COMPRESS
- 对于装入操作或卸装操作,数据文件数据是否已压缩:
- GZIP
- 使用 GZIP 压缩算法对数据文件数据进行压缩。
- 否
- 未对数据文件数据进行压缩。 这是缺省值。
- LZ4
- 数据文件数据是使用 LZ4 压缩算法进行压缩的。
- CRINSTRING
- 如何解释未转义的回车符 (CR) 或回车符换行 (CRLF) 字符:
- TRUE 或 ON
- 未转义的 CR 字符将解释为数据,而不是记录定界符。
- FALSE 或 OFF
- 未转义的 CR 将解释为记录定界符。 这是缺省值。
- CTRLCHARS
- 是否允许在 CHAR 或 VARCHAR 字段 ASCII 值 1 - 31。 必须对任何 NULL、CR 或 LF 字符进行转义。 允许值为:
- TRUE 或 ON
- 允许在 CHAR 或 VARCHAR 字段中使用 ASCII 值 1 - 31。
- FALSE 或 OFF
- 不允许在 CHAR 或 VARCHAR 字段中使用 ASCII 值 1-31。 这是缺省值。
- DATAOBJECT 或 FILE_NAME
- 要包含要创建的外部表的文件(或任何可被视为文件的介质)的标准名称。 如果未在表名之后立即指定文件名,那么此选项是必需的; 否则,将不允许此选项。
如果同时将 REMOTESOURCE 选项设置为 LOCAL(这是其缺省值),并且 extbl_strict_io 配置参数设置为 NO,那么外部表文件的路径是绝对路径,并且必须是 extbl_location 配置参数指定的路径之一。 否则,外部表文件的路径是相对于由 extbl_location 配置参数指定的路径,后跟表定义者的授权标识。 例如,如果将 extbl_location 设置为
/home/xyz,并且表定义者的授权标识为user1,那么外部表文件的路径相对于/home/xyz/user1/。该文件名必须是有效的 UTF-8 字符串。
对于装入操作,以下情况适用:- 该文件必须已经存在。
- 必需许可权:
- 如果外部表是指定的外部表,那么所有者必须具有对该文件的读许可权以及对 LOGDIR 目录的写许可权。
- 如果外部表是瞬态外部表,那么该语句的授权标识必须具有对该文件的读许可权以及对 LOGDIR 目录的写许可权。
- 如果文件已经存在会被覆盖掉。
- 必需许可权:
- 如果外部表是已命名的外部表,那么所有者必须对此文件的目录具有读和写许可权。
- 如果外部表是瞬态的,那么该语句的授权标识必须对此文件的目录具有读和写许可权。
- DATEDELIM
- 定界字符,用于根据 DATESTYLE 选项指定的格式来分隔日期的组件。 如果指定空字符串,那么日期组件之间没有定界符,并且必须将天数和月数指定为两位数字。 DATESTYLE 设置为 MONDY 或 MONDY2,缺省 DATEDELIM 值为空格。 TIMESTAMP_FORMAT 和 DATEDELIM 选项是互斥的。
- DATESTYLE
- 怎样解释日期格式。 对于 1 到 9 内的日期或月份,请使用 1 个数字、2 个数字或后跟一位数字的空格。 当 DATEDELIM 选项为空格时,您可以在该天之后指定逗号。 如果您执行以下操作,那么会发生错误:
- 指定日期、月份或年份为零
- 指定不存在的日期(例如,8 月 32 日或 2 月 30 日)
表 1. DateStyle 选项的可能值。 此示例显示在 DATEDELIM 设置为“-”时如何表示日期 2014 年 3 月 21 日。 值 描述 示例 YMD 4 位数的年份,2 位数的月份,2 位数的天。 这是缺省值。 2014-03-21 DMY 2 位数的天,2 位数的月份,4 位数的年份。 21-03-2014 MDY 2 位数的月份,2 位数的天,4 位数的年份。 03-21-2014 MONDY 3 个字符的月份,2 位数的天,4 位数的年份。 2014 年 3 月 21 日 DMONY 2 位数的天,3 个字符的月份,4 位数的年份。 21-Mar-2014 Y2MD 2 位数的年份,2 位数的月份,2 位数的天。 卸载不支持此功能。 14-03-21 DMY2 2 位数的天,2 位数的月份,2 位数的年份。 卸载不支持此功能。 21-03-14 MDY2 2 位数的月份,2 位数的天,2 位数的年份。 卸载不支持此功能。 03-21-14 MONDY2 3 个字符的月份,2 位数的天,2 位数的年份。 卸载不支持此功能。 14 年 3 月 21 日 DMONY2 2 位数的天,3 个字符的月份,2 位数的年份。 卸载不支持此功能。 21-Mar-14 - DATETIMEDELIM
- 一个单字节字符,用于分隔时间戳记数据类型的日期部分和时间部分。
- DATE_FORMAT
- 数据文件中“日期”字段的格式。 该值可以是 TIMESTAMP_FORMAT 标量函数接受的任何日期格式字符串。 缺省值为 YYYY-MM-DD。 DATE_FORMAT 选项与 DATEDELIM 或 DATESTYLE 选项互斥。
- DECIMALDELIM 或 DECIMAL_CHARACTER
- 数据类型 FLOAT、DOUBLE、TIME 和 TIMESTAMP 的十进制定界符。 允许的值为
','和'.'。 - DECPLUSBLANK
- 指定在卸载操作期间正十进制值的表示方式。
- DELIMITER 或 COLUMN_DELIMITER
- 这是用于对输入或输出记录的字段进行定界的字符。 缺省值为竖线 (
'|')。可以通过以下任何方式在 7 位 ASCII 范围(十进制 1 - 127)内指定字符:- 作为单个字符(例如,
DELIMITER ';') - 通过指定其对应的 ASCII 十进制值(例如,
DELIMITER 59或DELIMITER '59') - 通过指定其对应的 ASCII 十六进制值(例如,
DELIMITER x'3B')
只有通过指定其相应的 ASCII 十进制值或十六进制值,ISO 字符集输入文件才支持十进制范围 128 - 255。 如果输入文件在 UTF8 字符集中,那么不支持此定界符值范围。
- 作为单个字符(例如,
- ENCODING
- 该文件中的数据类型:
- UTF8
- 该文件使用 UTF8 encoding 用于所有字符数据。
- LATIN9
- 该文件将 LATIN9 编码 用于所有字符数据。
- INTERNAL
- 该文件同时使用 UTF8 和 LATIN9 编码的组合,或者您不确定使用哪种类型的编码。 系统会检查数据,并根据需要将数据编码。 检查数据会导致整体性能下降,因此只有在必要时才应使用此值。 这是缺省值。
- INTERNAL
- 这是缺省选项。
- DBCS_GRAPHIC
- 此值仅允许用于装入操作,而不允许用于卸载操作。 如果指定了此值,那么还必须指定 CCSID 选项。 在装入操作期间,将使用指定 CCSID 的双字节字符集对类型为 GRAPHIC 或 VARGRAPHIC 的字段进行编码;使用指定 CCSID 的混合字节字符集对所有其他类型的字段进行编码。注: 对于 EXPORT 实用程序创建的 DEL 文件,不能将 ENCODING 设置为 DBCS_GRAPHIC ,因为此类 DEL 文件是使用单个字符集进行编码的。
- ESCAPECHAR 或 ESCAPE_CHARACTER
- 要将哪个字符视为转义字符。 转义字符指示它后面的字符(否则将被视为字段定界字符或行尾顺序字符)将被视为字段中的值的一部分。 对于图形字符串数据,将忽略转义字符。 没有缺省值。
- FILLRECORD
- 对于装入操作,会将记录字段从左到右装入到目标表的列中。 此选项指定输入记录所包含的字段是否可以少于为目标表定义的列数:
- TRUE 或 ON
- 输入行可以包含更少的字段,前提是缺少值的所有列都是可空的。 缺失值设置为 NULL。 如果缺少值的一列或多列不可为空,那么将拒绝该记录。
- FALSE 或 OFF
- 包含较少列的输入行将被拒绝。 这是缺省值。
- FORMAT 或 FILE_FORMAT
- 源文件的数据格式如下所示:
- 文本
- 要装入或卸载的数据是文本定界格式的。 这是缺省值。
- INTERNAL
- 这些数据采用 Netezza Platform Software (NPS) 使用的内部格式。 仅当将数据从文件装入到数据库时,而不是当将数据卸载到文件时,此值才有效。 如果对 FORMAT 选项指定了此值,那么还必须指定下列选项,并且仅指定这些选项:
- DATAOBJECT 或 FILE_NAME。
- REMOTESOURCE、SWIFT 或 S3。 如果指定了 REMOTESOURCE 选项,那么它必须具有值 LOCAL 或 YES。
- COMPRESS。 此值必须设置为 GZIP。
- BINARY
- 数据是由 Db2 使用的内部格式。
- FIXED
- 该数据采用固定长度格式。
- IGNOREZERO 或 TRIM_NULLS
- 指定是否要废弃 CHAR 字段和 VARCHAR 字段中的二进制值 0。
- TRUE 或 ON
- 字节值零被忽略。
- FALSE 或 OFF
- 字节值零未被忽略。 这是缺省值。
- KEEP
- 二进制值零被接受,并且允许作为输入字段的一部分。
- INCLUDEHEADER 或 COLUMN_NAMES
- 对于卸载操作,是否要将表列名称作为标题包括在外部表文件中:
- TRUE 或 ON
- 表列名称将作为标题包括在内。
- FALSE 或 OFF
- 不将表列名称作为标题包括在内。 这是缺省值。
- INCLUDEZEROSECONDS
- 对于卸载操作,是否将 00 指定为秒的值(如果没有秒的值可用):
- TRUE 或 ON
- 指定 00 作为秒的值。
- FALSE 或 OFF
- 请不要指定秒数值。 这是缺省值。
- 对于装入操作,请指定数据文件中是否存在隐藏的列值。
- LFINSTRING
- 指定如何在字符串数据中解释未转义的行订阅源(有时称为 LF 或换行符)字符:
- TRUE 或 ON
- 仅当未转义的 LF 字符位于记录的最后一个字段时,才会将其解释为记录定界符;否则,会将其视为数据。 要使记录的最后一个字段中的 LF 字符被视为数据,请将该字段的值括在单引号或双引号中。
- FALSE 或 OFF
- 未转义的 LF 字符被解释为记录定界符,而与其位置无关。 这是缺省值。
对于卸载操作,不支持此选项。
注意: 此 SQL 兼容性增强功能仅在 Db2 V 11.5 Mod Pack 2 及更高版本中可用。 - LOGDIR 或 ERROR_LOG
- 将以下文件写入的目录:
- <database>.<schema>.<external-table-name>.<file-name>.<application-handle>.<id>.bad
- 包含已拒绝的记录(即,无法处理的记录)的文件。
- <database>.<schema>.<external-table-name>.<file-name>.<application-handle>.<id>.log
- 日志文件。
<file-name>指示)的文件的名称,以便不超过最大长度。如果在对分区执行操作时生成 .log 或 .bad 文件,那么生成的文件的名称将以句点作为后缀,后跟 3 位数字的分区号。
- MAXERRORS 或 MAX_ERRORS
- 对于装入操作,这是系统停止处理并立即回滚该装入的已拒绝记录数的阈值。 缺省值为 1(即,单个被拒绝的记录导致回滚)。
- MULTIPARTSIZEMB
当 DB2_ENABLE_COS_SDK 注册表变量设置为 ON 时,通过嵌入式供应商 COS SDK 促进 Db2 远程存储器 与云对象存储器的通信,该 SDK 允许 Db2 将对象/文件以多个部分(又称为“多重部件上传”)形式流式传输到云对象存储器。 此参数指定要卸载的文件的分块上传的分块大小(以兆字节 (MB) 为单位),并覆盖 MULTIPARTSIZEMB dbm config 参数中指定的值。 从 V11.5 修订包 7 开始,仅在 Linux (x86) 环境中提供此选项。
- MAXROWS 或 MAX_ROWS
- 如果设置为正整数,那么这将指定外部表中要处理的最大记录数(行数)。 如果设置为 0(缺省值),那么将没有限制并且将处理所有行。 在装入操作期间,如果 MAXROWS 设置为正值,那么在处理该行数后,无论某些行是被拒绝还是被跳过,系统都将结束装入操作并落实所有已插入的记录。
- MERIDIANDELIM
- 一个单字节字符,它以时间值的 12 小时定界和未定界格式将秒部分与 AM 标记或 PM 标记分隔开。
- NOLOG
- 指定是否已创建外部表的 .log 文件。
- NULLVALUE 或 NULL_VALUE
- 最多 4 个字节的 UTF-8 字符串,将用于指示 null 值。 缺省值为
'NULL'。 - PARTITION
- 如果为数据库启用了数据库分区功能 (DPF) ,那么可以将外部表分区为多个文件。 组成外部表的每个数据文件的名称都以句点作为后缀,后跟 3 位数字(从 000 到 999),该数字指示分区的编号。 例如,如果名称为 dataFile.txt 的外部表划分为三个分区,那么组成该表的文件将具有名称 dataFile.txt.000、dataFile.txt.001 和 dataFile.txt.002。 这些文件必须可从所有成员访问。对于分区外部表,PARTITION 选项指定该语句应用于哪个或哪些分区:
- PARTITION ALL
- 该语句将应用于构成外部表的所有分区。 对于卸载操作,此值是唯一允许的值。
- PARTITION (n TO n)
- 该语句将应用于指定范围内的所有分区,例如,分区(54 到 62)。
- PARTITION (n,n,…)
- 该语句仅适用于指定的一个或多个分区,例如,PARTITION (53) 或 PARTITION (51,57,58)。 如果指定了多个分区号,那么它们必须按升序排列(sqlcode SQL0263N ,带有 SQLSTATE=42615),并且不能有重复项(sqlcode SQL0265N,带有 SQLSTATE=42615)。
如果在对分区外部表执行操作时生成了 .log 或 .bad 文件,那么生成的文件的名称将以句点作为后缀,后跟 3 位分区号。
如果启用了 DPF 并且未指定 PARTITION 选项,那么会将外部表视为协调程序成员上的单分区表。 外部表文件以及 .log 文件和 .bad 文件的名称未使用分区号作为后缀。
如果未启用 DPF ,那么可以指定 PARTITION 选项,但只能使用值 ALL , (0 到 0) 或 (0) (SQL0644N)。 它将不会产生任何影响。
REMOTESOURCE 和 PARTITION 选项是互斥的。
- QUOTEDNULL
- 对于装入操作,如何解释包含在单引号或双引号中并且与 NULLVALUE 或 NULL_VALUE 选项指定的空值(例如,“null”或“NULL”)匹配的值:
- TRUE 或 ON
- 该值将解释为空值。 这是缺省值。
- FALSE 或 OFF
- 该值将解释为字符串。
- QUOTEDVALUE 或 STRING_DELIMITER
- 是否将数据值括在引号中:
- SINGLE 或 YES
- 将数据值括在单引号 (') 中。
- 双
- 将数据值括在双引号 ("") 中。
- 否
- 数据值未括在引号中。 这是缺省值。
- RECORDDELIM 或 RECORD_DELIMITER
- 要被解释为行(记录)定界符的字符串字面值。 缺省值为
'\n'。当 CRINSTRING 设置为 TRUE 时,RECORDDELIM 不能包含 CR ("\r") 字符 - 唯一例外的是 CRLF ("\r \n") 定界符只能与 CRINSTRING 一起用于文本格式。
- REMOTESOURCE
- 外部表文件所在的位置,以及(如果它位于远程系统上)是否要压缩文件数据:
- LOCAL
- 文件驻留在本地服务器上,即,托管数据库的系统上。 这是缺省值。
- YES
- 该文件驻留在本地服务器以外的系统上。 例如,如果客户机系统连接到数据库,并且该文件驻留在该系统上,请指定 YES。 在传输文件数据之前不会对其进行压缩。
- GZIP
- 与 YES 类似,除了在传输数据前使用 GZIP 压缩算法对文件数据进行压缩,并在接收后进行解压缩。 在传输大量可压缩数据时,这有助于提高总体性能。
- LZ4
- 与 YES 类似,除了在传输数据之前使用 LZ4 压缩算法对文件数据进行压缩,并在接收到数据后进行解压缩。 在传输大量可压缩数据时,这有助于提高总体性能。
REMOTESOURCE、SWIFT 和 S3 选项是互斥的。REMOTESOURCE 和 PARTITION 选项是互斥的。 如果 REMOTESOURCE 选项的值为 GZIP 或 LZ4,则不能指定 COMPRESS 选项。
- REQUIREQUOTES
- 引号是否是必需的:
- TRUE 或 ON
- 引号是必需的。 QUOTEDVALUE 选项必须设置为 YES、SINGLE 或 DOUBLE。
- FALSE 或 OFF
- 引号不是必需的。 这是缺省值。
- SKIPROWS 或 SKIP_ROWS
- 对于装入操作,在开始装入数据前跳过的行数。 缺省值为 0。 因为跳过的行是在跳过之前处理的,所以跳过的行仍能够导致处理错误。
- SOCKETBUFSIZE
- 从源文件中读取的数据块的大小(以字节为单位)。 有效值范围从 64 KB 到 800 MB。 如果指定此范围之外的值,那么该值将设置为最接近的有效值。 缺省值为 8 MB。
- STRICTNUMERIC
- 对于装入操作,当要插入到 DECIMAL 字段中的值的小数位超过为该字段定义的小数位时,如何处理该值:
- TRUE 或 ON
- 包含要插入的值的行被拒绝。 例如,如果将下列任何值装入到 DECIMAL(5,3) 字段中,那么包含该值的行将被拒绝:
12.666666666 -98.34496862785 0.00089 - FALSE 或 OFF
- 将接受包含要插入的值的行,并且小数部分中超过为字段定义的小数位的部分将被截断。 这是缺省值。 例如,前一个示例中的值将转换为:
12.666 -98.344 0.000
- SWIFT
- 指定源数据文件位于 Swift 对象存储库中。 REMOTESOURCE、SWIFT 和 S3 选项是互斥的。 使用 DATAOBJECT 选项来指定文件名。语法:
其中:SWIFT (endpoint, authKey1, authKey2, bucket)- 端点
- 这是一个字符串,用于指定 SWIFT Web Service 的 URL。 authKey1
- 这是一个字符串,用于指定用于验证用户的 Swift 开放式堆栈帐户的访问标识或用户名。 authKey2
- 这是一个字符串,用于指定用于验证用户的 Swift 开放式堆栈帐户的密码。 存储区
- 该文件所在的 Swift 开放式堆栈容器(存储区)的名称。
示例:CREATE EXTERNAL TABLE exttab1(a int) using (dataobject 'datafile1.dat' swift('https://dal05.objectstorage.softlayer.net/auth/v1.0/', 'XXXOS123456-2:xxx123456', 'b207c6e974020737d92174esdf6d5be9382aa4c335945a14eaa9172c70f8df16', 'my_dev' ) ) - S3
- 指定源数据文件位于与 S3 兼容的对象库中。 REMOTESOURCE、SWIFT 和 S3 选项是互斥的。 使用 DATAOBJECT 选项来指定文件名。语法:其中:
S3 (endpoint, authKey1, authKey2, bucket)- 端点
- 一个字符串,用于指定与 S3 兼容的 Web Service 的 URL。 authKey1
- 这是一个字符串,用于指定用于验证用户和所有用户操作的访问密钥的 S3 访问密钥标识。对于 IBM Cloud Object Storage,它是来自 HMAC 凭证的访问密钥标识。 authKey2
- 这是一个字符串,用于指定用于验证用户和所有用户操作的访问密钥的 S3 密钥。对于 IBM Cloud Object Storage,这是 HMAC 凭证中的秘密访问密钥。 存储区
- 该文件所在的 S3 存储区的名称。
注意:对于IBM Cloud Object Storage,要创建 HMAC 凭据,在创建新服务凭据时,请在添加内联配置参数字段中指定 "{"HMAC:true}。使用 AWS S3: 的示例CREATE EXTERNAL TABLE exttab2(a int) using (dataobject 'datafile2.dat' s3('s3.amazonaws.com', 'XXXOS123456-2:xxx123456', 'bs07c6e974040737d92174e5e96d5be9382aa4c33xxx5a14eaa9172c70f8df16', 'my_dev' ) )使用 IBM Cloud Object Storage 的示例:CREATE EXTERNAL TABLE exttab2(a int) using (dataobject 'datafile2.dat' s3('s3-api.us-geo.objectstorage.softlayer.net', '1a2bkXXXsaddntLo0xX0', 'XXxxiEPjJ7T7WBUz74E6abcdABCDE8Q7RgU4gYY9', 'my_dev' ) ) - AZURE
- 指定该源数据文件位于 Microsoft Azure Blob Storage 中。 REMOTESOURCE、SWIFT、S3 和 AZURE 选项是互斥选项。 使用 DATAOBJECT 选项来指定文件名。 语法:语法:其中:
AZURE (endpoint, authKey1, authKey2, bucket)- 端点
- 这是一个字符串,用于指定 AZURE Web Service 的 URL。 authKey1
- 这是一个字符串,用于指定用于验证用户的 Azure Blob Storage 帐户的访问标识或用户名。 authKey2
- 这是一个字符串,用于指定用于验证用户的 Azure Blob Storage 帐户的访问密钥。 存储区
- 该文件所在的 Azure Blob 存储容器(存储区)的名称。
示例:CREATE EXTERNAL TABLE exttab1(a int) using (dataobject 'datafile1.dat' azure('https://my_account.blob.core.windows.net', 'my_account', 'lW+oHjmZecPS++IKgThAHlMUOaFUA5C6Z2RlFmc9JPpK34RO/ZIOywzILxJnzGPHz6d/yDrcQDAwH5wySbOZMQ==', 'my_bucket' ) )使用 IBM Cloud Object Storage 的示例:CREATE EXTERNAL TABLE exttab2(a int) using (dataobject 'datafile2.dat' s3('s3-api.us-geo.objectstorage.softlayer.net', '1a2bkXXXsaddntLo0xX0', 'XXxxiEPjJ7T7WBUz74E6abcdABCDE8Q7RgU4gYY9', 'my_dev' ) ) - TIMEDELIM
- 这是一个单字节字符,用于分隔时间部分(小时、分钟和秒)。 缺省值为
':'。 如果 TIMEDELIM 设置为空字符串,那么小时、分钟和秒必须全部指定为两位数。 TIMESTAMP_FORMAT 和 TIMEDELIM 选项互斥。 - TIMEROUNDNANOS 或 TIMEEXTRASEZEROS
- 注: 此选项仅适用于 TIMESTAMP 列。
- TIMESTYLE
- 要在数据文件中使用的时间格式:
- 24HOUR
- 24 小时制格式,例如 23:55。 这是缺省值。
- 12HOUR
- 12 小时制格式,例如 11:55 PM。 AM 或 PM 标记之前可以有单个空格,并且不区分大小写。
- TIMESTAMP_FORMAT
- 数据文件中的时间戳记字段的格式。 该值可以是 TIMESTAMP_FORMAT 标量函数接受的任何格式字符串。 缺省值为 'YYYY-MM-DD HH.MI.SS'。 TIMESTAMP_FORMAT 选项与 TIMEDELIM、DATEDELIM、TIMESTYLE 或 DATESTYLE 选项是互斥的。
- TIME_FORMAT
- 这是数据文件中的时间字段的格式。 该值可以是 TIMESTAMP_FORMAT 标量函数接受的任何时间格式字符串。 缺省值为 HH.MI.SS。 TIME_FORMAT 选项与 TIMEDELIM 或 TIMESTYLE 选项互斥。
- TRIMBLANKS
- 外部表如何处理字符串中的前导空格或尾部空格(即,前导空格或尾部空格字符):
- LEADING
- 除去所有前导空格(即,在第一个非空白字符之前的空格)。
- TRAILING
- 所有尾部空格(即,最后一个非空白字符后面的空格)都将除去。
- BOTH
- 除去所有前导空格和尾部空格。
- NONE
- 不除去任何空白。 这是缺省值。
- TRUNCSTRING 或 TRUNCATE_STRING
- 系统如何处理超过其声明的存储大小的 CHAR 或 VARCHAR 字符串:
- TRUE
- 系统会截断超过其声明的存储大小的字符串值。
- FALSE
- 当字符串值超过其声明的存储器大小时,系统将返回错误。 这是缺省值。
- Y2BASE
- 作为 100 年范围的开始的年份。 指定为 2 位数字的年份将从今年开始计算。 默认值为 2000。 当 DATESTYLE 设置为 Y2MD、MDY2、DMY2、MONDY2 或 DMONY2 时,必须指定此选项。
表 3. 选项 选项 缺省值 应用于装入 应用到卸载 Azure (无缺省值) Y Y BOOLSTYLE 或 BOOLEAN_STYLE 1_0 Y Y CARDINALITY (无缺省值) Y Y CCSID (无缺省值) Y Y COMPRESS 否 Y Y CRINSTRING FALSE Y Y CTRLCHARS FALSE Y N DATAOBJECT 或 FILE_NAME (无缺省值) Y Y DATEDELIM '-' Y Y DATETIMEDELIM 空格 ("") Y Y DATESTYLE YMD Y Y DATE_FORMAT YYYY-MM-DD Y Y DECIMALDELIM 或 DECIMAL_CHARACTER '.' Y Y 定界符 '|' Y Y ENCODING INTERNAL Y 是1 ESCAPECHAR 或 ESCAPE_CHARACTER (无缺省值) Y Y FILLRECORD FALSE Y N FORMAT 或 FILE_FORMAT 文本 Y Y IGNOREZERO 或 TRIM_NULLS FALSE Y N INCLUDEHEADER 或 COLUMN_NAMES FALSE N Y INCLUDEZEROSECONDS FALSE Y Y INCLUDEHIDDEN FALSE Y N LFINSTRING FALSE Y N LOGDIR 或 ERROR_LOG 外部表文件的目标目录 Y N MULTIPARTSIZEMB MULTIPARTSIZEMB dbm config 参数指定的值。 Y N MAXERRORS 或 MAX_ERRORS 1 Y N MAXROWS 或 MAX_ROWS 0 Y N MERIDIANDELIM 空格 ("") Y Y NOLOG FALSE Y Y NULLVALUE 或 NULL_VALUE "NULL" Y Y PARTITION (无缺省值) Y Y QUOTEDNULL TRUE Y N QUOTEDVALUE 否 Y N RECORDDELIM 或 RECORD_DELIMITER "\n" Y N REMOTESOURCE LOCAL Y Y REQUIREQUOTES FALSE Y N SKIPROWS 或 SKIP_ROWS 0 Y N SOCKETBUFSIZE 8 MB Y Y STRICTNUMERIC FALSE Y N SWIFT (无缺省值) Y Y S3 (无缺省值) Y Y TIMEDELIM ':' Y Y TIMEROUNDNANOS 或 TIMEEXTRASEZEROS FALSE Y N TIMESTAMP_FORMAT ' YYYY-MM-DD HH.MI.SS' Y Y TIMESTYLE 24HOUR Y Y TIME_FORMAT HH.MI.SS Y Y TRIMBLANKS NONE Y Y TRUNCSTRING 或 TRUNCATE_STRING FALSE Y N Y2BASE 2,000 美元 Y N 1 仅适用于值 INTERNAL、UTF8 和 LATIN9。 - AS SELECT STATEMENT
- 指定对于全查询的派生结果表中的每一列,将为该表定义相应的列并使用查询的结果进行填充。 定义的每一列将沿用结果表相应列的以下属性(如果适用于该数据类型):
- 列名
- 列描述
- 数据类型、长度、精度和小数位
- 可空性
注意
- 无法处理的记录(如果有)将写入具有以下格式的名称的文件中:
错误记录在具有以下格式的名称的文件中:<database>.<schema>.<external-table-name>.<file-name>.<application-handle>.<id>.bad
这些文件位于由 LOGDIR 或 ERROR_LOG 选项指定的目录中。<database>.<schema>.<external-table-name>.<file-name>.<application-handle>.<id>.log对于对分区执行的操作,生成的 .bad 或 .log 文件的名称以句点为后缀,后跟 3 位分区号。
- 要创建、插入或删除已命名的外部表,请发出 CREATE、INSERT 或 DROP 语句。 不能在瞬态外部表中插入或删除该表。
- 删除外部表将删除该表定义,但不会删除与该表关联的数据文件。
限制
- 远程外部表限制:
- 例程中不允许此值
- 不允许使用 LOAD CURSOR
- 对于远程外部表 (即,对于外部表,不在 Swift 或 S3 对象库中,并且 REMOTESOURCE 选项设置为 LOCAL 以外的值):注: 单个查询或子查询一次不能从多个外部表中进行选择,并且不能多次引用同一个外部表。 如果需要,请将多个外部表中的数据合并到单个表中,并在查询中使用该表。
此外,联合操作不能涉及多个外部表。
- 只能通过在操作系统中定义的用户标识来查询外部表。
- 外部表不能由在 Windows 系统上运行的 Db2 实例使用。
- 正在装入的数据必须正确格式化。
- 您无法删除、截断或者更新外部表。
语法替代项
- 可以使用 SAMEAS 来代替 LIKE。
- 对于 REMOTESOURCE 选项,可以指定值 ODBC、JDBC 或 OLE-DB 来代替 YES。
- 如果 FORMAT 选项设置为 INTERNAL,那么可以对 COMPRESS 选项指定值 YES 来代替 GZIP。
示例
- 将数据卸载到外部表:
CREATE EXTERNAL TABLE 'order.tbl' USING (DELIMITER '|') AS SELECT * from orders;CREATE EXTERNAL TABLE 'export.csv' USING (DELIMITER ',') AS SELECT foo.x, bar.y, bar.dt FROM foo, bar WHERE foo.x = bar.x; - 从外部表装入数据:
INSERT INTO target SELECT * FROM EXTERNAL 'data.txt' USING (DELIMITER '|');INSERT INTO orders SELECT * FROM EXTERNAL 'order.tbl'( order_num INT, order_dt TIMESTAMP) USING (DELIMITER '|'); - 从外部表中选择数据:
SELECT * FROM EXTERNAL 'order.tbl' (order_num INT, order_dt TIMESTAMP) USING (DELIMITER '|');SELECT * FROM EXTERNAL 'test.txt' LIKE test_table USING (DELIMITER ',');SELECT x, y AS dt FROM EXTERNAL 'test.txt' ( x integer, y decimal(18,4) ) USING (DELIMITER ',');
