这几天一直在看kettle的内容,昨天的一项任务是 将一个老库中的数据转到临时库中。还是像往常一样,批量生成~
结果出现如下问题:
2014/08/12 12:26:42 - 写到 [T_BASE_008_PERFORM_TEAM_ANNALS].0 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : Because of an error, this step can't continue:
2014/08/12 12:26:42 - 写到 [T_BASE_008_PERFORM_TEAM_ANNALS].0 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : org.pentaho.di.core.exception.KettleException:
2014/08/12 12:26:42 - 写到 [T_BASE_008_PERFORM_TEAM_ANNALS].0 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : Error batch inserting rows into table [T_BASE_008_PERFORM_TEAM_ANNALS].
2014/08/12 12:26:42 - 写到 [T_BASE_008_PERFORM_TEAM_ANNALS].0 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : Errors encountered (first 10):
2014/08/12 12:26:42 - 写到 [T_BASE_008_PERFORM_TEAM_ANNALS].0 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : ORA-12899: 列 "REPORTTEST"."T_BASE_008_PERFORM_TEAM_ANNALS"."ORIGINAL_OPERA" 的值太大 (实际值: 251, 最大值: 200)
可是 T_BASE_008_PERFORM_TEAM_ANNALS 这张表计算 length(ORIGINAL_OPERA) 显示最常的也就 130 。。。
TNN的 之前转移500多张表都没问题,今儿是怎么了?
其他表都没有问题,唯独T_BASE_008_PERFORM_TEAM_ANNALS,就会出错。
查找了大量说法,
发现有的ORA-12899 这个报错与字符集相关的说法。。。
但是我的情况是,源数据与目标数据是在同一个库里的。字符集应该是一样的吧。。。
由于我的pl/sqldev 有点儿问题,就用navicat查看 了下表结构。T_BASE_008_PERFORM_TEAM_ANNALS,
问题出来了, 对比了一下源表 与目标表的表结构。
有些字段类型不一样,
源的 nvarchar2, 在目标表中全变成了varchar2了。。。看来是kettle的问题。kettle建表时自动生成的语句有待检查。但是批量生成时就没法检查了。
在目标表中将对应源的nvarchar2都改过来。
job重新跑起来~ 恩~完成~
===============================================================================
后来查了一下 varchar2 与 nvarchar2的区别。
nvarchar2 把单个字母、汉字都当成一个字符,认为是1字节;
varchar2 则字母1字节、汉字2字节;
由于kettle根据 源的nvarchar2(200),在目标 生成的新varchar2(200);//这样,实际目标空间只有源空间的一半。
那么实际数据转移时必然不够存的。
原来用length() 查到的是字符个数,两个表必然都是200以内,所以没有发现问题;
lengthb() 则 返回 字节个数,恩,这个要直观一些,以后就用这个了。
===============================================================================
总结一下:
lengthb( ) //返回字节数
length() //返回字符数
kettle 自动生成表 的语句 会将nvarchar2→varchar2;
nvarchar2 把单个字母、汉字都当成一个字符,认为是1字节;
varchar2 则字母1字节、汉字2字节;
===============================================================================
唉,最后再吐槽一下。。kettle毕竟是开源工具,用了这段时间,感觉是,这玩意儿做的太粗糙了,各种细节功能也不齐全。。。虽说结合java二次开发后功能很强大。但是,对于我这样的新手来说,一路上真是各种问题啊,而且也没有哪篇详细文档能做参考。
建议从项目进度的考虑还是选用其他商业ETL工具好些。
好了继续工作 (ง •̀_•́)ง
执行表输出,报错ORA-00904,“XXX”标识符无效。其中XXX是字段,在源表内,但目标表内没有。
解决方法:将表输出配置页面的specify database fields打上勾。 (¬、¬) 。。这里又想吐槽kettle的愚钝了。。。既然都已经指定了对应字段,还要另外打个勾浪费操作。。。
注意!!!
Generate SQL 并不会 执行job内的SQL语句,而是立即检查当前过程内需要的SQL语句,比如建表,改表。(因此无法通过修改job文件内的建表SQL语句来达到修改表结构的目的)
关于添加一个自增字段 ,找到两个组件:【Add value fields changing sequence】 和 【增加序列 】
如图构建模型:
结果:
///
实验:重新run时,【增加序列】节点 不能继续增长,会重1开始。
///
kettle 的表输出 内首次读取的字段名 会存入缓存, 如果此间更改了字段名称,kettle的的表输出组件内是不会更改的,需要先Tools->Database->Clear Cache.
///