kettle中实现动态SQL查询

kettle中实现动态SQL查询详细说明kettle中两者方式实现动态查询,分别是占位符和变量方式,示例使用H2数据库,方便学习。

大家好,又见面了,我是你们的朋友全栈君。

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?

kettle中实现动态SQL查询

 

      示例中,首先使用生成行步骤(“Generdate Rows”)生成一行带有两个字段的记录,分别按顺序代替表输入SQL语句中的占位符。实际场景中,通常使用动态处理结果产生期望值代替生成行步骤。

      kettle中实现动态SQL查询

      接下来是表输入步骤,其中配置SQL查询语句,包含问号占位符,通过在“Insert Data Step”的下拉框中选择前一步骤,来替换问号的值。

 

通过传输不同的值多次执行查询

      如果你想循环执行查询,使用不同值替换占位符;就需要占位符生产步骤生成多行数据,并把表输入的选项“Execute for each row”选中。 本示例文件名称为placeholders_in_loop.ktr。

 

 kettle中实现动态SQL查询

占位符的局限性

      虽然通过给占位符绑定值查询非常有效,但也有一些场景不能使用,下面一些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(命名参数)赋值进行测试。

kettle中实现动态SQL查询

 

变量和占位符一起使用

      如果有必要,我们可以混合这两种技术;本示例中使用变量作为表名词,同时使用占位符作为前面步骤的输入值。示例文件variables_and_placeholders.ktr。

    SELECT name, population FROM ${ANIMALS_TABLE}WHERE population > ?

kettle中实现动态SQL查询

示例下载

      可以在这里下载示例文件。所有示例都kettle5.1版中测试通过,而且测试数据是用H2内存数据库,下载后可以直接运行,非常容易,希望你学习顺利。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152505.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java video_video java, video java Suppliers and Manufacturers at Alibaba.com

    java video_video java, video java Suppliers and Manufacturers at Alibaba.com1/6$100.00-$350.00/Unit1.0Units(Min.Order)CardlanAFCMchinasupportJavaCardsforprogram,freeSDKforProgrammingOver17Years’ManufacturingExperienceShenzhenCardlanTechnologyCo.Wespec…

    2025年6月5日
    1
  • NPN PNP开关电路[通俗易懂]

    NPN PNP开关电路[通俗易懂]   在设计电路板时需要用3.3v开关5v电源,所以这时候用到了NPN-PNP开关电路。我最开始的设计是这样的(npn采用的是9013,pnp采用的是8550):   开始没发现问题。真正调试的时候发现NPNQ1管烫的非常厉害。后才才发现原因:应该在QI集电极和Q2基极之间加上一个电阻。这是因为当向图中这样连接时VCC通过Q2直接加在了Q1的ce两端,Q2的be电压很小,相当于有一大…

    2025年12月10日
    4
  • 启动ucosii之四OSTaskCreate()[通俗易懂]

    启动ucosii之四OSTaskCreate()[通俗易懂]函数原型来自OS_TASK.C/***********************************************************************************************************                                           CREATEATASK**************

    2025年9月21日
    5
  • IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?「建议收藏」

    IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?「建议收藏」背景知识IP地址IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信。我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”,而Internet中的路由器,就相当于电信局的“程控式交换机”。IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a

    2022年6月24日
    33
  • UART 接口测试「建议收藏」

    UART 接口测试「建议收藏」串口UART测试程序带传参波特率、奇偶校验、停止位、数据位#include<stdio.h>#include<stdlib.h>#include<string.h>#include<pthread.h>#include<fcntl.h>#include<errno.h>#include<std…

    2025年11月17日
    3
  • qtreewidget用法_qtreewidgetitem

    qtreewidget用法_qtreewidgetitemTreeWidget形成的树形控件是比较简单易用的,经过这段时间的使用,有了一些了解,特意总结下来,以供参考:1.隐藏表头2.添加元素3.为节点添加CheckBox4.添加右键菜单5.消息响应6.QTreeWidget提供了一些方法

    2022年10月1日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号