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内存数据库,下载后可以直接运行,非常容易,希望你学习顺利。

时间: 2024-08-02 15:11:11

kettle中实现动态SQL查询的相关文章

存储过程中执行动态Sql语句

存储过程中执行动态Sql语句 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能,还可以编写更安全的代码.EXEC在某些情况下会更灵活.除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql. 1.EXEC的使用 EXEC命令有两种用法,一种是执行一个存储

一次动态sql查询订单数据的设计

订单数据一般是变化比较多的数据,查询条件也是比较复杂,如果没有一个规则解释,写接口的变动就会比较频繁:由于个人不喜欢在业务端使用拼接sql的方式,另外本身是做安全出身,业务端的sql拼接容易sql注入,所以不考虑使用:为了满足这个特性,将订单的条件进行了一次划分: 状态.用户.时间.公司.上车地点.下车地点: 第一步: 先处理状态查询, 状态查询定义在t_om_group表中,后台人员可以手动添加状态分组,前端业务只需要状态分组对应哪些状态即可:如: group_id 1 对应 order_st

获取动态SQL查询语句返回值(sp_executesql)

在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值查询Cost值(表名不确定但表结构确定,如下面的Product表) 如果不考虑获取返回值,我们这样写即可: declare @tableName varchar(50) declare @id varchar(10) declare @cost numeric(18,2) declare @sql

JPA 2.0 中的动态类型安全查询

转载地址:http://www.uml.org.cn/j2ee/200912114.asp 如果编译器能够对查询执行语法正确性检查,那么对于 Java 对象而言该查询就是类型安全的.Java™ Persistence API (JPA) 的 2.0 版本引入了 Criteria API,这个 API 首次将类型安全查询引入到 Java 应用程序中,并为在运行时动态地构造查询提供一种机制.本文介绍如何使用 Criteria API 和与之密切相关的 Metamodel API 编写动态的类型安全查

怎样SQL存储过程中执行动态SQL语句

MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能,还可以编写更安全的代码.EXEC在某些情况下会更灵活.除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql.1.EXEC的使用 EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处

Hibernate动态SQL查询

一.需求背景 给hibernate插上ibatis动态查询的翅膀,既保留crud的简洁性,又能收获ibatis的特性. 二.ibatis的动态查询 1 <select id="findUser" resultClass="User"> 2 SELECT * From User 3 <dynamic prepend="WHERE"> 4 <isNull property="id"> 5 id

mybatis 动态SQL查询总结

背景 ××项目需要提供系统部分函数第三方调用接口,基于安全性和避免暴露数据库表信息的基础上进行函数接口的设计,根据第三方调用身份的权限提供某张表的自定义集合.本项目基于mybatis的持久层框架,支持定制化的SQL,这样可以避免拼接sql语句的痛苦.例如拼接时要确保不能添加空格,还要注意去掉列表的最后一个列名的都逗号.基于OGNL的表达式的mybatis框架可以彻底解决这种痛苦. 动态返回mysql某张表指定列的名字,类型和注释 <select id="queryColumns"

MyBatis中的动态SQL

动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形. 动态 SQL 元素和 JSTL 或基于类似 XML 的文本处

MyBatis的动态SQL查询-让查询更灵活多变!

序言 MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了.它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的. MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护