我正在使用Kettle进行转换并遇到同样的问题,尝试获取基于整数的' out' mysql中的参数,(该字段实际应该是bigint
但我不认为它在Kettle中得到支持。)
我已经使用十进制实现了这个确切问题的解决方法,但是我有一段时间试图将值首先返回到id字段(而不是id_1
),并且其次,将其转换回整数,以便将其插入数据库。
这是相关流程:
这是步骤定义:
在来自lookup existing id
的入站流中,已经添加了一个名为id
的字段,它是一个小数,可以是值,也可以为null。如果它为null,则在filter rows
步骤触发此db过程查找,换句话说,它在db procedure
步骤将始终为null(因此我无法使用这里有一个输入参数。)
所以我想要发生的是当它离开db procedure
步时,id
应该填充out参数的值(理想情况下它将是一个整数,但我可以使用小数因为这个bug)。但相反,我将id_1
插入到流中。
然后继续下行,假设我将id字段中的值作为小数,然后我需要将其转换回Integer,以便可以无错误地插入到数据库中。我不知道如何在Kettle中编写javascript,但我无法找到该语言的文档。
所以我的问题有两个:
id
回流吗?id
(或id_1
)转换为整数并将其放回流中的id
字段? 答案 0 :(得分:0)
Kettle基于Java构建并使用JDBC驱动程序。让我总结一些来源并调查问题(我将包括Postgresql,因为我最常使用它,这些信息对我有价值)
首先让我们检查数据类型的大小:java.util.Long是8字节长,mysql bigint类型是8字节长,postgresql bigint类型也是8字节长。除了一个问题外,它们实际上与实际尺寸匹配。 Mysql支持unsigned bigint,这超出了范围java.util.Long。我假设问题出现在java.util.Long的边值,最小值和最大值上。
无论如何,我试图重现(在Postgres上只有这个时候可用给我)
Postgresql 9.4,JDBC驱动程序postgresql-9.4-1201-jdbc41.jar,Kettle 5.4.0,jdk7
http://forums.pentaho.com/showthread.php?48950-loosing-precision-of-BIGINT-workaround
一切都很好看。最有可能是mysql jdbc驱动程序有问题,或者它是不支持java.math.BigInteger的水壶问题。 java.math.BigInteger是数据类型,用于处理mysql中的unsigned bigint值,如下所述
http://dev.mysql.com/doc/connector-j/en/connector-j-reference-type-conversions.html
示例csv
"id" "surname" "name" "birth_dt"
"1" "Gorovits" "Alex" "2001-01-01"
"2" "Osmani" "Adeb" "1998-03-06"
"" "Maiters" "John" "1981-07-07"
"" "Mateus" "Angela" "2004-04-04"
"5" "Sander" "Tom" "1990-05-05"
注意: