南大通用GBase8s 常用SQL语句(四十一)

拒绝文件
在加载期间发生转换错误的行或违反外部表上检查约束的行将写入到拒绝文件中。REJECTFILE 子句声明了该拒绝文件的路径和文件名称。
如果您在同一会话中对同一个表执行另一个装入,则任何先前相同名称的拒绝文件将被覆盖。
拒绝文件条目具有以下格式:
filename, record, reason-code,
field-name: bad-line
下表描述拒绝文件中的这些元素:
元素 描述
filename 输入文件的名称
record 输入文件中记录号,在该文件中检测到错误
reason-code 错误的描述
field-name 外部字段名称,其中行中发生第一个错误;如果拒绝不是特定于某个列,则为
bad-line 造成错误的行(仅限于定界或固定位置字符文件)
拒绝文件以 ASCII 格式写 filename, record 、field-name 和 reason-code。bad-line 信息随输入文件类型不同而变化。
对于定界文件或固定位置字符文件,错误行有多达 80 个字符被直接复制到拒绝文件中。
对于 GBase 8s 内部数据文件,错误行选项不放在拒绝文件中,因为您不能在文件中编辑二进制表示法;但 filename 、record 、reason-code 和 field-name 仍在拒绝文件中报告,这样您可以隔离该问题。请使用 Table Options 子句指定外部数据的格式。
以下错误可导致行被拒绝。
错误文本 说明
CONSTRAINT constraint name 违反了该约束。
CONVERT_ERR 有字段遇到转换错误。
MISSING_DELIMITER 找不到定界符。
MISSING_RECORDEND 找不到记录结尾。
NOT NULL 在 field-name 中找到 NULL 值。
ROW_TOO_LONG 输入记录超过 32 千字节。
虚拟处理器
GBase 8s 外部表使用 FIFO 虚拟处理器。当初始化服务器时,创建一个 FIFO 虚拟处理器。可使用 onmode -p 命令添加其它 FIFO 虚拟处理器。例如,使用以下语句添加三个 FIFO 虚拟处理器:
onmode -p +3 fifo
无法删除 FIFO 虚拟处理器。
FIFO 虚拟处理器用来处理与使用 PIPE 子句定义的管道相关的 I/O 。
有关使用 FIFO 虚拟处理器的更多信息,请参阅 GBase 8s 管理员指南。
外部表示例
本节中的示例显示使用外部表加载和卸装数据的不同方法。
以下是 CREATE EXTERNAL TABLE 语法的示例。在本示例中,创建带有两列且名为 empdata 的外部表。DATAFILES 子句指示数据文件的位置,指定该文件是定界的,指示拒绝文件的位置并指定该拒绝文件包含的错误不能多于 100 个。
CREATE EXTERNAL TABLE empdata
(
empname char(40),
empdoj date
)
USING
(DATAFILES
(
“DISK:/work/empdata.unl”
),
FORMAT “DELIMITED”,
REJECTFILE “/work/errlog/empdata.rej”,
MAXERRORS 100);
使用 SAMEAS 子句创建外部表
SAMEAS template 子句在新表的定义中使用来自 template 表所有的列名称和数据类型。以下示例使用 empdata 表的列名及其数据类型来创建外部表:
CREATE EXTERNAL TABLE emp_ext SAMEAS empdata
USING
(DATAFILES
(
“DISK:/work/empdata2.unl”
),
REJECTFILE “/work/errlog/empdata2.rej”,
DELUXE
);
向外部表中卸装数据
以下示例显示将数据库表的数据加载到外部表所使用的语句。
CREATE EXTERNAL TABLE ext1( col1 int )
USING
(DATAFILES
(
“DISK:/tmp/ext1.unl”
)
);

    CREATE TABLE base (col1 int);
    INSERT INTO ext1 SELECT * FROM base;

还可以按照以下示例使用 SELECT…INTO EXTERNAL 语法卸装数据:
SELECT * FROM base
INTO EXTERNAL emp_target
USING
(DATAFILES
(
“DISK:/tmp/ext1.unl”
)
);
从外部表查询数据将其加载到数据库表
以下示例从外部表查询,且显示了将查询到的数据加载到数据库表的各种方法。
CREATE EXTERNAL TABLE ext1( col1 int )
USING
(DATAFILES
(
“DISK:/tmp/ext1.unl”
)
);

    CREATE TABLE target1 (col1 int);
    CREATE TABLE target2 (col1 serial8, col2 int);
    
    SELECT * FROM ext1;
    SELECT col1,COUNT(*) FROM ext1 GROUP BY 1;
    SELECT MAX(col1) FROM ext1;
    SELECT col1 FROM ext1 a, systables b WHERE a.col1=b.tabid;
    
    INSERT INTO target1 SELECT * FROM ext1;
    INSERT INTO target2 SELECT 0,* FROM ext1;

从数据库表中的将数据卸装到一个使用 FIXED 格式的文本文件中
以下示例创建了一个名为 emp_ext 的外部表,定义了列名及其数据类型,并从使用固定格式的数据库卸装数据。
CREATE EXTERNAL TABLE emp_ext
( name CHAR(18) EXTERNAL CHAR(20),
address VARCHAR(40) EXTERNAL CHAR(40),
empno INTEGER EXTERNAL CHAR(6)
)
USING (
FORMAT ‘FIXED’,
DATAFILES
(
“DISK:/work2/mydir/emp.fix”
)
);

INSERT INTO emp_ext SELECT * FROM employee;
从数据文件将数据加载到使用 FIXED 格式的数据库表中
下一示例创建了名为 emp_ext 的外部表,并从固定格式文件将数据加载到数据库中。
CREATE EXTERNAL TABLE emp_ext
( name CHAR(18) EXTERNAL CHAR(18),
address VARCHAR(40) EXTERNAL CHAR(40),
empno INTEGER EXTERNAL CHAR(6)
)
USING (
FORMAT ‘FIXED’,
DATAFILES
(
“DISK:/work2/mydir/emp.fix”
)
);

INSERT INTO employee SELECT * FROM emp_ext;
在 DATAFILES 子句中使用格式化字符
要处理三个文件,请按照以下示例创建 DATAFILES 子句。
DATAFILES
(
“DISK:/work2/extern.dir/mytbl.%r(1…3)”
)
下列显示了当运行语句时列表是如何展开的:
DATAFILES
(
“DISK:/work2/extern.dir/mytbl.1”,
“DISK:/work2/extern.dir/mytbl.2”,
“DISK:/work2/extern.dir/mytbl.3”

上一篇:Python检测Windows剩余磁盘空间


下一篇:解决Linux系统下U盘只读文件系统问题