kettle中实现动态SQL查询
大家好,又见面了,我是你们的朋友全栈君。
kettle中实现动态SQL查询
在ETL项目中,通常有根据运行时输入参数去执行一些SQL语句,如查询数据。本文通过kettle中的表输入(“table input”)步骤来说明动态查询、参数查询。示例代码使用内存数据库(H2),下载就可以直接运行,通过示例学习更轻松。
SQL查询语句中占位符绑定字段值
第一个接近动态语句的是大家熟悉的从SQL代码中执行,开始写一个SQL查询,包含一些占位符,然后绑定值到占位符,使之成为一个有效的查询并执行。根据需要可以绑定多个值并循环执行。本示例的名称为placeholders.ktr文件。
在示例中,首先创建presidents表并填入数据(关于美国总统的内容),代码如下,字段分别为:名称、州、政党、职业、毕业院校、任职日期、离职日期。
CREATE TABLE presidents(
name VARCHAR(255),
state VARCHAR(255),
party VARCHAR(64),
occupation VARCHAR(64),
college VARCHAR(64),
took_office DATE,
left_office DATE
);
下面的查询语句用问号占位符,当开始日期(第一个?号)和结束日期(第二个?号)绑定到SQL的问号占位符,在查询入职日期在一定期间的总统信息:
SELECTname,took_office FROM presidents WHEREtook_officeBETWEEN? AND?
示例中,首先使用生成行步骤(“Generdate Rows”)生成一行带有两个字段的记录,分别按顺序代替表输入SQL语句中的占位符。实际场景中,通常使用动态处理结果产生期望值代替生成行步骤。
接下来是表输入步骤,其中配置SQL查询语句,包含问号占位符,通过在“Insert Data Step”的下拉框中选择前一步骤,来替换问号的值。
通过传输不同的值多次执行查询
如果你想循环执行查询,使用不同值替换占位符;就需要占位符生产步骤生成多行数据,并把表输入的选项“Execute for each row”选中。 本示例文件名称为placeholders_in_loop.ktr。
占位符的局限性
虽然通过给占位符绑定值查询非常有效,但也有一些场景不能使用,下面一些SQL不能使用占位符。这些示例都非常通用,但是不能使用占位符。
不能用占位符代替表名词,否则查询将不执行。
SELECT some_fieldFROM ?
不能使用占位符代替查询的字段名称,下面的查询可以成功绑定参数,但只是作为一个常量,而不是字段的名称。
SELECT ? asmy_field FROM table
不能使用占位符绑定逗号分隔的多个列表项值;如果你绑定 “1,2,3″ 给下面的查询语句,将得到意外的结果。
SELECT * FROM testWHERE id IN (?)
你期望得到的结果是:
SELECT * FROM testWHERE id IN (“1,2,3”)
但是运行的结果却是这样,传输一个字符串,却得到三个值,而实际情况完全不确定有几个值传输进来。
SELECT * FROM testWHERE id IN (1,2,3)
为了解决这些场景的问题,需要使用kettle的变量动态构造查询文本,下面详细说明。
SQL查询中使用kettle变量
表输入步骤支持替换查询中的变量或参数,假设有一系列结构完全相关的表,分别是: mammals, birds, insects(动物、鸟、昆虫),可以使用kettle变量作为表的名称。假设我们有一个变量,名称为:ANIMALS_TABLE,赋值为birds,我们设置“Replace Vaiables”选项选中。如果我们写下面的查询:
SELECT name,population FROM ${ANIMALS_TABLE}
在执行一定被成功的替换成:
SELECT name,population FROM birds
如果设置变量的值为“mammals”或“insects”,则将动态查询不同的表。当占位符不能胜任是,使用变量技术可以帮助我们解决。示例的名称为variables.ktr,运行时不要忘了给parameter(命名参数)赋值进行测试。
变量和占位符一起使用
如果有必要,我们可以混合这两种技术;本示例中使用变量作为表名词,同时使用占位符作为前面步骤的输入值。示例文件variables_and_placeholders.ktr。
SELECT name, population FROM ${ANIMALS_TABLE}WHERE population > ?
示例下载
可以在这里下载示例文件。所有示例都kettle5.1版中测试通过,而且测试数据是用H2内存数据库,下载后可以直接运行,非常容易,希望你学习顺利。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152505.html原文链接:https://javaforall.cn
相关文章
- SQL手工注入漏洞测试(Sql Server数据库)
- 2023-01-03:超过5名学生的课。编写一个SQL查询来报告 至少有5个学生 的所有班级,返回结果不限顺序。请问sql语句如何写? +---------+
- SQL语句实现查询并自动创建Missing Index
- sql server实现在多个数据库间快速查询某个表信息的方法
- SQL 多条件查询几种实现方法详细介绍
- MySQL动态SQL:实现动态查询的高效方式。(mysql动态sql)
- 约束Oracle中实现SQL约束的技巧(oracle添加sql)
- 利用Oracle时间SQL技术提升效率(oracle时间sql)
- SQL Server中使用子查询实现数据挖掘(sqlserver子查询)
- sql 技术MongoDB:非SQL的新技术(mongodb不包含)
- MySQL实现SQL数据同步的方法探究(mysql同步sql)
- 文件MySQL实现轻松加载SQL文件(mysql加载sql)
- 实现数据安全——SQL Server 锁查询(sqlserver锁查询)
- 查询SQL Server上的连续查询实现优化(sqlserver 连续)
- 从SQL到MySQL——提升数据库的技术升级之路(sql 转 mysql)
- 处理用SQL Server实现自动批量处理(sqlserver批次)
- 查询SQL Server中多表联合查询的简单实现(sqlserver多表)
- Oracle数据库如何导出SQL文件?(oracle 导sql)
- PL/SQL连接MS SQL服务器:一种实现多数据库访问的桥梁(plsql链接mssql)
- MySQL中SQL窗口教程,轻松了解查询修改删除数据库表中数据的基本操作(mysql 中sql窗口)
- MySQL中实现动态SQL的方法与技巧(mysql中动态sql)
- SQL与Redis实现数据的迅速存取(sql与redis)
- MySQL实现两条 SQL 拼接操作(mysql两条sql拼接)
- Oracle SQL替换指南简单操作轻松有效实现(oracle中sql替换)
- Oracle中使用SQL实现取整(oracle中sql取整)
- Oracle SQL实现多表联查,挑战极限(oracle sql多表)
- Oracle SQL基线检测实现安全性提升(oracle sql基线)
- 用ASP和SQL实现基于Web的事件日历
- 数据库SqlParameter的插入操作,防止sql注入的实现代码