我真正的问题有点复杂,但我尝试做的事情应该是非常基本的,所以我尽量简化所有事情。
问题
我需要使用JavaScript函数计算一个值,然后我需要使用这个计算值对数据库执行一些操作,例如我的转换可能如下所示:
修改的Java脚本值
我创建了一个计算我的值的JavaScript函数:
//Script here
var calculated_value = "Hello, this is some value!";
此函数返回一个名为calculated_value
的字段String
,如果我测试它看起来很好:
执行SQL脚本
然后我使用参数创建了一个SQL脚本,如:
INSERT INTO my_table (column) VALUES (?)
并且我已将上一步返回的calculated_value
设置为第一个参数
问题
但是,这不起作用,如果我启动转换,我会收到一条错误,指出该参数尚未设置:
2014/05/03 15:44:26 - An error occurred, processing will be stopped:
2014/05/03 15:44:26 - Couldn't execute SQL: INSERT INTO my_table (valore) VALUES (?)
2014/05/03 15:44:26 -
2014/05/03 15:44:26 - Statement parameter 1 not set.
2014/05/03 15:44:26 - Error initializing step [Execute SQL script]
使用变量?
然后我决定再次尝试使用水壶变量。 JavaScript代码变为:
//Script here
var calculated_value = "Hello, this is some value!";
setVariable("my_variable", calculated_value, "s");
然后我修改了SQL脚本以使用变量替换:
INSERT INTO my_table (column) VALUES (${my_variable})
然而,我仍然没有运气,变量没有被替换......或者有时它会被替换,但是旧值而不是当前值。
我做错了什么?我怎样才能解决我的问题?
我正在使用Kettle - Spoon 4.4.0,但我计划很快升级。
答案 0 :(得分:3)
你快到了。为了在SQL步骤中使用参数,您需要检查"执行每一行"。这样,该步骤将触发与流输入行一样多的INSERT语句。
在旁注中,我假设您的解决方案背后的逻辑比问题中出现的逻辑更深,因为为了在表中插入值,有更合适的步骤(表输出,插入/更新)。
答案 1 :(得分:0)
这是我发现使用变量的解决方案。
似乎无法在同一转换上设置和使用变量,因此我们需要创建一个调用设置变量的转换的作业,从这一点开始,所有其他转换都可以使用已设置的变量:
设置变量转换
我的问题中的Java Script步骤不会生成任何行,它只会在现有的一组行上生成一个列,因此它不能成为转换的第一步,但我们必须添加一个空行"生成行"步骤:
我的JavaScript代码仍然相同:
//Script here
var calculated_value = "Hello, this is some value!";
并设置我的变量,我决定使用" Set Variables"步骤:
执行SQL转换
"设置变量"之后的所有转换;转换现在可以使用变量替换。
我的SQL脚本执行查询:
INSERT INTO my_table (column) VALUES ('${CALCULATED_VALUE}')
(请注意我必须引用变量,这可能导致SQL注入问题......但在我的例子中它可能没问题)。我只需设置"变量替换"国旗,它的工作原理!
但是,我仍然试图使用参数而不是变量。
可在此处找到一些参考:Using Variables in Kettle。