加载时源文件与被加载表列出现不匹配问题,如何操作?

此问题的关键在于加载控制文件ctl的编写,针对不同情况修改table_fields的内容。
table_fields中罗列的列名必须与数据文件的列顺序一致。
1、如果数据文件列少,数据表列多,则多出的列必须允许为空,在table_fields中不需要罗列该列名;
2、如果数据文件列多,数据表列少,则文件中多出的列在table_fields中列名后加filler;
3、如果数据文件列顺序与数据表列顺序不同,则table_fields中罗列的列必须顺序上对应数据文件。

举例如下:

原始数据文件:
1,2,3,4
1,2,3,4
1,2,3,4

(1)文件中字段少于表定义的情况
加载数据文件全部列到表gt1的a,b,c,d列。
建表语句:

create table gt1 (a int ,b int ,c int ,d int ,e int); 

加载控制文件:

[ceshi] 
disp_server=192.168.105.211:6666 
file_list=/opt/gtest/test.tbl 
format=3 
null_value='null' 
delimiter=',' 
db_user=gbase 
db_name=test 
table_name=gt1 
hash_parallel=1 
table_fields='a,b,c,d'

加载后结果:

gbase> select * from gt1;
+------+------+------+------+------+
| a    | b    | c    | d    | e    |
+------+------+------+------+------+
|    1 |    2 |    3 |    4 | NULL |
|    1 |    2 |    3 |    4 | NULL |
|    1 |    2 |    3 |    4 | NULL |
+------+------+------+------+------+
3 rows in set (Elapsed: 00:00:00.01)

(2)文件中字段多于表定义的情况:
加载数据文件前3列到表gt2的a,b,c列。
建表语句:

create table gt2 (a int ,b int ,c int );

加载控制文件:

[ceshi] 
disp_server=192.168.105.211:6666 
file_list=/opt/gtest/test.tbl 
format=3 
null_value='null' 
delimiter=',' 
db_user=gbase 
db_name=test 
table_name=gt2 
hash_parallel=1 
table_fields='a,b,c,1 filler'

加载后结果:

gbase> select * from gt2;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|    1 |    2 |    3 |
|    1 |    2 |    3 |
|    1 |    2 |    3 |
+------+------+------+
3 rows in set (Elapsed: 00:00:00.00)

(3)文件中字段多于表定义的情况:
加载数据文件的第4,2列到表gt3的a,b列。
建表语句:

create table gt3 (a int ,b int );

加载控制文件:

[ceshi] 
disp_server=192.168.105.211:6666 
file_list=/opt/gtest/test.tbl 
format=3 
null_value='null' 
delimiter=',' 
db_user=gbase 
db_name=test 
table_name=gt3 
hash_parallel=1 
table_fields='1 filler,b,2 filler,a' 

加载后结果:

gbase> select * from gt3;
+------+------+
| a    | b    |
+------+------+
|    4 |    2 |
|    4 |    2 |
|    4 |    2 |
+------+------+
3 rows in set (Elapsed: 00:00:00.00)

使用orato8a从oracle数据库中导出数据时应注意事项

1、指定sql语句导出时的注意事项
指定sql语句时,程序的执行过程和使用sqlplus本质上没有区别,所以必须保证指定的sql语句在sqlplus中也能正确执行,如果想使用并行导出来增加速度,那么可以使用hint来实现。需要注意的是,hint只是建议性的参数,是否真正启用并行还需要oracle内部自行评估,所以,可能会出现指定 parallel hint 后无效的情况。

2、全表导出时的注意事项
使用全表导出(指定表名)的方式来导出时必须注意以下几点:

  1. 如果指定的表不在指定用户的schema下的话,就必须指定owner,同时必须保证指定用户拥有owner用户下数据表的访问权限,否则仍然无法导出成功。
  2. 使用这种模式来导出数据时orato8a需要访问到oracle的系统表来获取指定数据表的rowid分布,所以,指定用户必须拥有系统表的访问权限。
  3. parallel参数只在全表导出时起作用。