今天进行dcp考试,发现外部表创建总是失败,最后通过manager创建成功,下来分析一下发现视图中第一了外部表中列id NULLABLE 是N(不允许为空),DM8 SQL语言使用手册中定义了外部表,其中一条就是5. 外部基表不能存在任何约束条件;因此我认为这道题不够严谨。需要修正。
3.6.1.2 定义外部表
需指定如下信息:
1. 表名、表所属的模式名;
2. 列定义;
3. 控制文件路径。
语法格式
CREATE EXTERNAL TABLE <表名定义> <表结构定义>;
<表名定义>
::=[<模式名>.]<表名>
<表结构定义> ::=
(<列定义> {,<列定义>})
<列定义> ::=
<列名> <数据类型>
<列定义> 参见 3.6.1 节说明
<数据文件参数列表>
::= PARMS(<参数选项> {,<参数选项>})
<参数选项> ::=
[FIELDS DELIMITED BY <表达式>] |
[RECORDS DELIMITED BY <表达式>]|
[ERRORS
[BADFILE '<数据文件路径>']|
[LOG <日志文件路径>]|
[NULL_STR
[SKIP <跳过行数>]|
[CHARACTER_CODE <文件字符集>]
<控制文件目录> ::=
DEFAULT DIRECTORY <控制文件目录名>
<控制文件选项> ::=
LOCATION ('<控制文件名>')
<数据文件目录> ::=
DEFAULT DIRECTORY <数据文件目录名>
<数据文件选项> ::=
LOCATION ('<数据文件名>')
参数
1. <模式名> 指明该表属于哪个模式,缺省为当前模式;
2. <表名> 指明被创建的外部基表名;
3. <列名> 指明基表中的列名;
4. <数据类型> 指明列的数据类型,暂不支持多媒体类型;
5. <控制文件路径> 指明使用的控制文件的路径的字符串;
6. <数据文件路径> 指明使用的数据文件路径的字符串;
7. <参数选项>
FIELDS 表示列分隔符;RECORDS 表示行分隔符,缺省为回车;
ERRORS 表示忽略外部表数据转换中出现错误的行数,取值范围为大于 0 的正整数,缺省为
0,表示不忽略错误。LOG 表示日志文件路径,如果不指定则不会生产日志;NULL_STR 指
定数据文件中 NULL 值的表示字符串,默认忽略此参数;SKIP 指定跳过数据文件起始的逻
辑行数,默认为 0;CHARACTER_CODE
指定数据文件中数据的编码格式,默认为 GBK,可
选项有 GBK,UTF-8,SINGLE_BYTE 和 EUC-KR;
8. <表达式> 字符串或十六进制串类型表达式;
==============使用说明======================
语句功能供 DBA 或具有
CREATE_TABLE 权限的用户定义外部基表。MPP 环境下不支持创建外部表。
使用说明:
1. <表名>指定了所要建立的外部基表名。如果<模式名>缺省,则缺省为当前模式。
表名需要是合法的标识符,且满足 SQL 语法要求;
2. 外部表的表名最大长度为 128 个字符;
3. 所建外部基表至少要包含一个<列名>指定的列,在一个外部基表中,各<列名>不
得相同。一张外部基表中至多可以包含 2048 列;
4. 外部基表不能存在大字段列;
5. 外部基表不能存在任何约束条件;
6. 外部基表不能为临时表,不能建立分区;
7. 外部基表上不能建立任何索引;
8. 外部基表是只读的,不存在表锁,不允许任何针对外部表的增删改数据操作,不允
许 TRUNCATE 外部表操作;
9. 控制文件路径,以及数据文件路径建议采用绝对路径;
DCP考试中有一题是不是错误的,请大家一同分析一下:
因业务需要,请根据/opt/emp.txt文件,建立外部表DMTEST.EMP。(5分)
表结构如下:
序号 TABLE_NAME COLUMN_NAME DATA_TYPE NULLABLE COMMENTS
1 EMP ID INT N 编号
2 EMP SEX CHAR(4) Y 性别
3 EMP NAME VARCHAR(20) Y 姓名
4 EMP EMAIL VARCHAR(50) Y 邮箱
5 EMP TEL VARCHAR(15) Y 电话
SQL> create external table DMTEST.EMP(ID INT not null,SEX CHAR(4),NAME VARCHAR(20),EMAIL VARCHAR(50),TEL VARCHAR(15)) from '/opt/emp.ctl';
create external table DMTEST.EMP(ID INT not null,SEX CHAR(4),NAME VARCHAR(20),EMAIL VARCHAR(50),TEL VARCHAR(15)) from '/opt/emp.ctl';
第1 行附近出现错误[-2609]:外部表不支持的操作.
已用时间: 1.776(毫秒). 执行号:0.
通过图形界面manager工具获取到DDl语句如下:且执行成功
SQL> CREATE EXTERNAL TABLE "DMTEST"."EMP"("ID" INT,"SEX" CHAR(4),"NAME" VARCHAR(20),"EMAIL" VARCHAR(50),"TEL" VARCHAR(15)) FROM '/opt/emp.ctl';
操作已执行
已用时间: 34.950(毫秒). 执行号:301.
以上唯一不同的地方就是emp表中的id值是不是允许为null。题目要求是NULLABLE 是N,但是外部表不支持约束。因此没法设置其值不能为空
SQL> DESC DMTEST.EMP
行号 NAME TYPE$ NULLABLE
---------- ----- ----------- --------
1 ID INTEGER Y
2 SEX CHAR(4) Y
3 NAME VARCHAR(20) Y
4 EMAIL VARCHAR(50) Y
5 TEL VARCHAR(15) Y
已用时间: 5.647(毫秒). 执行号:312.
SQL>
其实手册中也定义了外部表外部基表不能存在任何约束条件。因此这个题是不是有问题?




