如何解决 Kettle 中的 in/out mysql 参数错误?

How to work around this in/out mysql parameter bug in Kettle?

我正在使用 Kettle 进行转换并遇到同样的问题,试图在 mysql 中获取基于整数的 'out' 参数的值,(该字段实际上应该是 bigint 但我认为 Kettle 不支持它)。

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 步骤始终为空(因此我不能在这里使用 in-out 参数).

所以我想要发生的是当它离开 db procedure 步骤时,id 应该填充 out 参数的值(理想情况下它是一个整数,但我可以生活由于错误而使用小数点)。但相反,我将 id_1 插入到流中。

然后再往下看,假设我将 id 字段中的值作为小数,然后我需要将其转换回整数,以便可以将它无误地插入到数据库中。我真的不知道如何在 Kettle 中编写 javascript,而且我找不到关于该语言的文档。

所以我的问题是双重的:

  1. 我可以让 db 过程将 id 插入回流中吗?
  2. 我将如何编写脚本(或使用步骤)将 id(或 id_1)转换为整数并将其放回 id 字段中流?

Kettle 基于 Java 构建并使用 JDBC 驱动程序。让我总结一些资源并调查问题(我将包括 Postgresql,因为我最常使用它并且这些信息对我很有价值)

首先让我们检查数据类型的大小:java.util.Long是8字节长,mysqlbigint类型是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 之前过滤具有空值的行。