利用dmfldr多表装载实现类似Oracle sqlldr when模块的验证测试,通过多表装载进行判断,实现数据分发,例如下面数据,根据第3列判断,将值为上海的数据分发导入到A表,值为北京的数据分发插入到B表。
1,张三,上海
2,李四,上海
3,王老五,北京
4,刘老六,北京
dmfldr是达梦提供的快速数据装载命令行工具,功能与 Oracle 的 sqlldr类似,可以将达梦数据库中的数据按一定的格式导出到文本,支持导出为文本文件或csv文件,也可反过来将文本或csv格式的文件快速的导入到达梦数据库中。
在数据导入场景中,在客户端命令行中提交命令后,会分析控制文件和将数据文件打包发送给服务端,随后服务端完成数据装载后返回消息,包括日志文件和错误数据等,数据导出时则反之,客户端提交命令后,服务端分析导出情况将数据打包发送到客户端,客户端按照规则生成指定的格式文件。
在dmfldr使用命令中,有USERID和控制文件两个必选参数,USERID 用于指定用户名和密码等登录数据库服务器;控制文件用来指定导入或导出的表、数据文件、行分隔符、列分隔符等信息,且USERID必须是命令行中的第一个参数,CONTROL文件中指定导入参数,命令格式如下:
./dmfldr SYSDBA/SYSDBA CONTROL='/opt/data/fldr.ctl'
通过在控制文件中指定多个 INTO TABLE 子句,可以将一批数据同时向多个表进行装载。 每个 INTO TABLE 子句中都可以指定 WHEN 过滤条件、FIELDS 子句和列定义子句。
对于多表装载的使用需注意以下几点:1、对于第二个及其之后的INTO TABLE 子句,在其 coldef_option 中,必须为所有列指定 POSITION 选项;2、 在 INTO TABLE 子句的目标表中,如果目标表各不相同,则一个批次就可以完成装载完成(不管含有多少表,只需扫描一次数据文件即可);如果含有重复的目标表,则相同的表需要分批次导入(每当遇到相同的表时,就需要再扫描一遍源文件。N 个重复的表,就需要扫描 N 次源文件)。
注意参数property_option,在此类场景中,往往定位数据起始边界较为困难,通过此参数可进行精准定位
1、 position(p1:p2):从数据文件中每行数据的第 p1 个字节到第 p2 个字节为该 列值,包含边界 p1,p2;
2、 position(p1):从数据文件中每行数据的第 p1 个字节开始,到下一个列分隔符之间的数据为该列值,包含边界 p1;
场景构造,将美元和人民币的汇率分别导入的A表和B表
1、创建表
create table "SYSDBA"."rat_usd"
(
"curtp_cd" VARCHAR(3),
"curtp_name" VARCHAR(50),
"mid_rate" VARCHAR(50),
"usd_mid_rate" VARCHAR(50),
"rmb_mid_rate" VARCHAR(50)
);
create table "SYSDBA"."rat_rmb"
(
"curtp_cd" VARCHAR(3),
"curtp_name" VARCHAR(50),
"mid_rate" NVARCHAR(50),
"usd_mid_rate" VARCHAR(50),
"rmb_mid_rate" VARCHAR(50)
);
2、准备测试数据
3、配置ctl文件
CHARACTER_CODE:字符编码;
NULL_MODE:载入时空值是否处理为 NULL;
UNREP_CHAR_MODE:非法字符处理选项(0),为 0 时表示跳过该数据行,为 1 时表示使用(*)替换错误字节
WHEN:过滤条件
D:\dmdbms\bin>dmfldr SYSDBA/SYSDBA:5436 CONTROL='D:\dmdbms\bin\test.ctl'
select * from rat_rmb;
select * from rat_usd;
在遇到数据长度不一时,对列的POSITION定位需格外注意,第一个列必须POSITION(p1:p2)精准定位,包含边界 p1,p2;,第二个列可以配置position(p1):从数据文件中每行数据的第 p1 个字节开始,到下一个列分隔符之间的数据为该列值,包含边界 p1,相当于从p1开始下一个列,后续的列根据列分隔符自动识别;
文章
阅读量
获赞