首页 > 数据库 >KingbaseES生成动态SQL

KingbaseES生成动态SQL

时间:2024-03-28 15:48:57浏览次数:26  
标签:语句 format 生成 编译 SQL test 动态 KingbaseES

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方式更简单高效。

标签:语句,format,生成,编译,SQL,test,动态,KingbaseES
From: https://www.cnblogs.com/kingbase/p/17931080.html

相关文章

  • KingbaseES Create Index include 介绍
    在数据库性能优化的世界中,索引始终扮演着至关重要的角色。KingbaseES创建索引语法中的INCLUDE关键字为索引创建提供了额外的灵活性,允许在B-Tree索引中包含额外的非键(Non-Key)列。这些列虽然不参与索引的排序或搜索过程,但可用于提高某些查询的效率,尤其是在执行索引覆盖扫描(Index-......
  • KingbaseES 临时表
    临时表在数据库管理和数据处理中有着广泛的应用,主要用于存储临时数据或进行中间计算。临时表中的数据对会话是私有的,每个会话只能看到和修改自己会话的数据。KingbaseES支持本地临时表和全局临时表。创建临时表时若不指定GLOBAL或LOCAL,则默认值指定为LOCAL。本地临时表和全局临......
  • KingbaseES 执行计划常见节点介绍
    KingbaseES中explain命令来查看执行计划时最常用的方式。其命令格式如下:explain[option]statement其中option为可选项,常用的是以下5种情况的组合:analyze:执行SQL并且显示实际的运行时间和其他统计信息,默认FALSE。注意:加了analyze会真正执行SQL语句verbose:显示附加信息,比如......
  • KingbaseES 通过触发器实现查看表的创建时间
    从oracle迁移至KingbaseES的用户,经常会问在KingbaseES中怎么查询表的创建时间。由于KingbaseES本身并不直接存储表的创建时间,所以获取这一信息通常需要依赖于间接方法或日志记录。如果确实有这种需求,可以通过创建事件触发器的将相关的信息保存下来。建立保存信息的数据表CREAT......
  • KingbaseES查找慢查询语句和阻塞会话
    在处理数据库性能问题时,识别和分析慢查询及阻塞会话是至关重要的步骤。数据库管理员和开发人员常常需要依赖特定的工具和查询语句来追踪这些性能瓶颈。当数据库响应变慢或出现处理延迟时,第一步通常是查找那些执行时间过长的查询,这些查询通常被称为“慢查询”。同时,阻塞会话即那......
  • KingbaseES自动生成列介绍
    在KingbaseES中createtable语句支持GENERATEDcolumn(生成列)。生成列是一种特别的列类型,它的值基于其他列的值计算得出。因此,生成列之于列,有点像视图之于表的关系。存在两种类型的生成列:存储生成列和虚拟生成列。存储生成列在数据被写入(插入或更新操作)时进行计算,并且像常规列......
  • KingbaseES LWLock buffer_mapping 等待
    在KingbaseES数据库中,会话在将数据块与共享缓冲池的缓冲区相关联时,会触发“LWLockbuffer_mapping”等待事件。这类事件涉及到一种轻量级锁(lwlock),类似于Oracle中的闩锁。这个锁在不同的数据库中可能有不同的名称,但通常被称为buffer_mapping或BufMappingLock。它主要用于实现对HAS......
  • KingbaseES V8R6集群运维案例之---主备failover切换原因分析
    案例说明:生产环境,KingbaseESV8R6的集群发生failover切换,分析集群切换的原因。适用版本:KingbaseESV8R6集群架构:137.xx.xx.67主原备库137.xx.xx.94原主库137.xx.xx.68vip地址一、日志分析1、分析原备库hamgr.log如下所示,通过原备库hamgr.log日志获取到具体......
  • KingbaseES V8R6数据库运维案例之---用户权限导致的备份恢复故障
    案例说明:由于限制了用户对数据库的访问,导致在执行‘sys_backup.shinit’初始化物理备份时,执行失败。适用版本:KingbaseESV8R6一、问题现象如下所示,执行‘sys_backup.shinit’初始化物理备份:1、执行初始化失败[kingbase@node201bin]$shsys_backup.shinitERROR:Con......
  • 使用fabric.js框选图片区域并生成svg图
    仍然是在图片上特定区域根据数值显示不同的颜色的需求,改进下代码。增加了测量辅助线、对齐辅助线、生成svg图等,基本满足需求。demo中包括了生成json、svg字符串和下载svg图。<scriptsrc="../plugins/fabric.min.js"></script><scriptsrc="../plugins/aligning_guidelines.......