1. 动态SQL

动态SQL在程序启动时会根据输入参数替换相应变量。使用动态SQL可以创建更强大和灵活的应用程序,但在编译时SQL语句的全文不确定,因此运行时编译会牺牲一些性能。动态SQL可以是代码或SQL语句的一部分,动态部分要么由开发人员输入,要么由程序本身创建。

1.1 动态SQL使用场景

在PL/SQL函数或过程中有时需要生成动态命令,因为命令涉及不同表或数据类型,仅在运行时才能确定具体对象或值。这时比较适合使用动态SQL。

另外,在特定情况下,如果静态SQL语句无法执行,或者您真的不知道函数或过程要执行的确切SQL语句,那么您必须使用动态SQL。

1.2 动态SQL VS 静态SQL

静态SQL 动态SQL
SQL语句在编译时编译 SQL语句在运行时编译
SQL语句在编译时进行解析,有效性检查表、视图和过程。编译时优化并生成应用程序执行计划 SQL语句在运行时进行编译解析SQL语句,有效性检查表、视图和过程,优化并生成应用程序执行计划
性能好,速度快 与静态SQL相比较性能不好
不够灵活 非常灵活

2. 生成动态SQL

共有三种方式实现动态SQL。使用format函数,使用quote_ident 和 quote_literal函数,使用连接操作符||。

注意:构建查询时插入的动态值需要仔细处理,因为可能需要包含引号。

2.1 使用format函数

首先我们介绍下format函数的形式参数:

%s s格式化参数值作为简单字符串. %I I 处理参数值作为SQL 标识符,有必要增加双引号. %L L 引用参数作为SQL字面值.

这里先要区分两个概念:SQL标识符和SQL字面值。

SQL标识符表示数据库名称、表名、索引名、schema名、约束名、游标名、触发器、列、视图名称。在动态SQL中,I%会按照SQL标识符进行解析。

SQL字面值表示显示值,数值、字符、字符串、布尔值,不代表SQL标识符。有不同类型的字面值:

类型 举例
字符串 String ‘Hello! everyone’
整数 Integer 45, 78, +89 , -465,6E5
数值 Decimal 45.56
日期 DateTime ‘5/20/2020’ , TIMESTAMP ‘2020-05-20 12:01:01’;
字符 Character A’ ‘%’ ‘9’ ’ ’ ‘z’ ‘(’
布尔 Boolean true, false, null

下面举例说明:

test=# SELECT format('Hello! Welcome to my %s!', 'Blog') as msg;
msg
----------------------------
Hello! Welcome to my Blog!
(1 行记录) test=# SELECT format('%s! Welcome to my %s! - %s','Hi','Blog','Ourtechroom') as msg;
msg
---------------------------------------
Hi! Welcome to my Blog! - Ourtechroom
(1 行记录) test=# SELECT format('INSERT INTO %I VALUES(%L)', 'tbl_test', 'test');
format
-------------------------------------
INSERT INTO tbl_test VALUES('test')
(1 行记录)

2.2 使用quote_indent 函数

select quote_ident('Hello World'); // "Hello World" 字面量增加引号

select quote_ident('mytable'); // mytable 表名称自动去掉引号

除此之外还有几个类似函数。 QUOTE_LITERAL(string text), QUOTE_LITERAL(value anyelement), QUOTE_NULLABLE(value anyelement);

QUOTE_LITERAL函数返回值自动增加引号。QUOTE_NULLABLE对于非空参数增加引号,否则返回null。

2.3 使用连接操作符||

 query := 'SELECT score FROM stu_temp WHERE name='''
|| name
|| '''';

这种方式对于需要转义单引号比较麻烦,且容易造成SQL注入。

3. 总结

本文介绍三种方式实现动态SQL语句,并通过示例对比不同方式的差异。相比使用format方式更简单高效。

KingbaseES生成动态SQL的更多相关文章

  1. 【转】Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    原文链接:http://www.cnblogs.com/quanyongan/p/3152290.html 最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和  ...

  2. DB2存储过程实现查询表数据,生成动态SQL,并执行

    一.动态执行SQL PREPARE S1 FROM 'delete from test'; EXECUTE S1; 二.使用游标 DECLARE V_CURSOR CURSOR FOR SELECT ...

  3. Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate 如果是在配置文件的话那就是dynamic -insert 和 dynamic- ...

  4. 使用mybatis的动态sql解析能力生成sql

    需求: 计算平台,有很多表,打算提供一个基于sql的服务接口, sql不能完全在配置页面写死, 要能根据参数不同执行不同的语义,防止sql个数爆炸 把mybatis原码down下来, 改造一下测试用例 ...

  5. spring boot-mybatis三种动态sql(5)

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

  6. mybatis的注解开发之三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

  7. spring boot(8)-mybatis三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

  8. Spring Boot (10) mybatis三种动态sql

    脚本SQL xml配置方式见mybatis讲解,下面是用<script>的方式把它照搬过来,用注解来实现.适于xml配置转换到注解配置 @Select("<script&g ...

  9. SpringBoot+MyBatis的动态SQL、使用动态SQL时List传值错误解决方案

    目录 实现动态SQL的四种方式: 1.XML配置 2.脚本SQL 3.在方法中构建SQL 4.结构化SQL 关于动态SQL的List传值错误问题 1.错误代码 2.解决错误 实现动态SQL的四种方式: ...

  10. MySQL存储过程动态SQL语句的生成

    用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...

随机推荐

  1. 【OpenGL ES】渐变凸镜贴图

    1 前言 ​ 正方形图片贴到圆形上 中将正方形图片上的纹理映射到圆形模型上,凸镜贴图 中介绍了将圆形图片上的纹理映射到凸镜模型上.如果将原图片逐渐变为凸镜效果,中间的变化过程又是什么样的? ​ 图片的 ...

  2. SPA单页应用的优缺点

    SPA单页应用的优缺点 Single Page Web Application是一种特殊的Web应用,其所有的活动局限于一个Web页面中,仅在该Web页面初始化时加载相应的HTML.JavaScrip ...

  3. Swoole从入门到入土(22)——多进程[Process]

    Swoole中的Process模块比原生php提供的pcntl模块,提供了更易用的多进程编程接口. 简单总结,Process模块有如下特点: · 可以方便的实现进程间通讯· 支持重定向标准输入和输出, ...

  4. junit使用stub进行单元测试

    stub是代码的一部分,我们要对某一方法做单元测试时,可能涉及到调用第三方web服务.假如当前该服务不存在或不可用咋办?好办,写一段stub代码替代它. stub 技术就是把某一部分代码与环境隔离起来 ...

  5. 【Android逆向】算法还原2

    这题比较简单 1. app-release.apk 安装至手机 提示需要输入账号和密码 2. jadx 打开看看 public native boolean check(byte[] bArr, by ...

  6. 美团面试:说说OOM三大场景和解决方案? (绝对史上最全)

    首先,咱们先聊聊,什么是OOM? 小伙伴们,有没有遇到过程序突然崩溃,然后抛出一个OutOfMemoryError的异常?这就是我们俗称的OOM,也就是内存溢出.简单来说,就是你的Java应用想要的内 ...

  7. pgrep查询当前运行程序的pid

    pgrep 运行的程序 [root@c1 ~]# pgrep matmul 2634730

  8. 用virtualenv创建虚拟环境

    步骤 1.打开终端cmd,直接输入命令pip install virtualenv,前提已经将pip加入到环境变量中了 2.在e盘创建一个专门用来装虚拟环境的文件夹,如django_web_env 3 ...

  9. Simulink模型指标分析与模型重构的最佳实践 - 软件模型质量保证不可忽视的一环

    在基于模型的开发中,优质的模型架构是生成优质代码的必要前提.静态模型分析对于模型的质量保证有着至关重要的作用,同时建模规范已在业内有着广泛而成熟的应用.然而建模规范并非模型设计原则合规性的唯一考量标准 ...

  10. 浅谈 rxgo 在项目中的使用方式

    项目中使用到了 RxGo ,感觉现有的处理方式有一定的优势,当然也有一定的有劣势,遂记录下来,免得自己忘记. 本文介绍的只是 rxgo 的一种方式而已,如果你有不错的使用方式,请不吝赐教,谢谢. 对 ...