如何在Kettle中解决这个输入/输出mysql参数错误?

时间:2015-09-12 08:37:45

标签: pentaho kettle

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

How to retrieve OUT parameter from MYSQL stored procedure to stream in Pentaho Data Integration (Kettle)?

我已经使用十进制实现了这个确切问题的解决方法,但是我有一段时间试图将值首先返回到id字段(而不是id_1),并且其次,将其转换回整数,以便将其插入数据库。

这是相关流程:

enter image description here

这是步骤定义:

enter image description here

在来自lookup existing id的入站流中,已经添加了一个名为id的字段,它是一个小数,可以是值,也可以为null。如果它为null,则在filter rows步骤触发此db过程查找,换句话说,它在db procedure步骤将始终为null(因此我无法使用这里有一个输入参数。)

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

然后继续下行,假设我将id字段中的值作为小数,然后我需要将其转换回Integer,以便可以无错误地插入到数据库中。我不知道如何在Kettle中编写javascript,但我无法找到该语言的文档。

所以我的问题有两个:

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

1 个答案:

答案 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

关于实际问题。以下解决方案示例: enter image description here

示例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之前过滤具有空值的行。