如何解决 Kettle 中的这个 in/out mysql 参数错误?
Posted
技术标签:
【中文标题】如何解决 Kettle 中的这个 in/out mysql 参数错误?【英文标题】:How to work around this in/out mysql parameter bug in Kettle? 【发布时间】:2015-09-12 08:37:44 【问题描述】:我正在使用 Kettle 进行转换并遇到同样的问题,试图在 mysql 中获取基于整数的“out”参数的值,(该字段实际上应该是 bigint
,但我认为它不支持水壶)。
How to retrieve OUT parameter from MYSQL stored procedure to stream in Pentaho Data Integration (Kettle)?
我已经用小数实现了这个确切问题的解决方法,但我有一个地狱般的时间试图首先将值返回到 id 字段(不是id_1
),然后将其转换回一个整数,因此它可以插入到数据库中。
这是相关流程:
这是步骤定义:
在来自lookup existing id
的入站流中,已经添加了一个名为id
的字段,它是一个小数,可以是一个值,也可以是空值。如果它为空,它会在filter rows
步骤触发此数据库过程查找,换句话说,它在db procedure
步骤将始终为空(因此我不能在此处使用输入输出参数)。
所以我想要发生的是当它离开db procedure
步骤时,id
应该填充 out 参数的值(理想情况下它是一个整数,但由于这个错误,我可以接受小数)。但相反,我将id_1
插入到流中。
然后再往下走,假设我将 id 字段中的值作为小数,然后我需要将其转换回整数,以便可以将其插入数据库而不会出错。不过,我真的不知道如何在 Kettle 中编写 javascript,也找不到有关该语言的文档。
所以我的问题是双重的:
-
我可以让 db 过程将
id
重新插入到流中吗?
如何编写脚本(或使用步骤)将id
(或id_1
)转换为整数并将其放回流中的id
字段?
【问题讨论】:
【参考方案1】:Kettle 基于 Java 构建并使用 JDBC 驱动程序。让我总结一些来源并调查问题(我将包括 Postgresql,因为我最常使用它并且这些信息对我很有价值)
http://wiki.pentaho.com/display/EAI/PDI+Rows+Of+Data https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html http://www.tutorialspoint.com/jdbc/jdbc-data-types.htm首先我们检查数据类型的大小: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 中的无符号 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"
注意事项:
DBLookup 不适用于空值,因此您可能需要在运行 DBLookup 之前过滤具有空值的行。【讨论】:
好的,谢谢,我实际上已经完成了这项工作,我找到了一个“setField”步骤,用于从 id_1 中取出值并将其分配回 db 过程分支中的 id。然后我不知道怎么做,但我让 Integer 也能正常工作,所以之前可能是其他一些问题导致了异常。但现在它无论如何都可以工作了,我完全去掉了 Javascript 步骤。以上是关于如何解决 Kettle 中的这个 in/out mysql 参数错误?的主要内容,如果未能解决你的问题,请参考以下文章