我有一个包含多个SQL语句的SQL文件,我需要使用Kettle / Pentaho PDI 6.1.0从文本文件中读取它们。
所有语句都使用分号分隔,但每个语句可以跨越多行:
CREATE TABLE Staging01 AS
SELECT ....
WHERE ...;
UPDATE Staging01
SET ....
WHERE ...;
我需要解析文件,将每个sql语句作为单个字符串。
我尝试使用文本输入文件步骤,但它总是逐行读取数据。
你能帮忙吗?
谢谢。
答案 0 :(得分:0)
我认为你应该使用" Row denormalizer"添加一列以对SQL指令的所有行进行分组后(当遇到&#34 ;;"时,此新字段将更改)。为了得到";"在流中不要将其指定为分隔符。
答案 1 :(得分:0)
Text-File-Input没问题,只需将每一行作为单个字段读取,例如选择FIXED模式和足够大的字段大小以创建名为line
的字段。不要忘记在右侧启用修剪。
根据您的示例输入,我们的想法是删除空行(它是TFI的默认设置)并连接形成语句的行。我们知道组中的最后一行是以分号结尾。
让我们使用User-Defined-Java-Expression创建一个序列_seq
line.endsWith(";") ? 1 : 0
对于我们的目的,字段_seq
是一次性的,因此我们使用Analytic-Query向前窥视一行,从而产生字段seq
。 If-Field-Value-Is-Null会将无用的空值转换为0给我们。
现在让我们使用分组计算一系列group
作为累计和
seq
。
最终,我们可以使用Group-By和group
字段将line
与空格字符连接起来。
这是一个数据流解决方案。你确定可以编写一个简单的FSM脚本,但为什么你会使用Kettle呢?