首页 > 数据库 >GaussDB数据库SQL系列-动态语句

GaussDB数据库SQL系列-动态语句

时间:2024-09-29 11:24:36浏览次数:1  
标签:语句 -- GaussDB 游标 查询 SQL

一、前言
在数据库中构建动态SQL语句是指根据不同的条件或参数创建不同的SQL语句。这通常是为了适应不同的业务需求,提高SQL的灵活性和效率。GaussDB数据库是一款具备高性能、高可用性和高扩展性的关系型数据库,它提供了丰富的功能和工具,支持动态SQL语句的构建。下面我们将介绍如何使用GaussDB数据库构建动态SQL语句。

二、构建动态SQL语句的基本步骤和注意事项
1、基本步骤

分析需求:首先需要明确业务需求,了解需要执行哪些SQL查询操作,并根据需求的不同来动态构建SQL语句。
准备参数:根据查询操作的不同,准备相应的参数,如筛选条件、排序规则等。
SQL拼接:根据需求和参数,使用字符串拼接方式构建SQL语句。
执行查询:使用GaussDB数据库的查询接口,执行构建好的SQL语句并获取查询结果。
处理结果:将查询结果进行处理和展示,可以是前端页面或后端接口等形式。
2、主要事项
避免SQL注入:在拼接SQL语句时,务必注意避免SQL注入的风险,不要直接拼接用户输入的内容。
性能优化:对于大规模数据的查询操作,需要进行性能优化,如使用索引、分页查询等方式来提高查询效率。
事务处理:如果涉及事务处理,需要使用GaussDB数据库的事务管理功能来确保数据的一致性和可靠性。
安全性保障:对于敏感数据的查询操作,需要进行安全性保障,如数据脱敏、权限控制等方式来保护数据的安全。
三、GaussDB中执行动态查询语句(示例)
GaussDB提供两种方式:使用EXECUTE IMMEDIATE、OPEN FOR实现动态查询。前者通过动态执行SELECT语句,后者结合了游标的使用。当需要将查询的结果保存在一个数据集用于提取时,可使用OPEN FOR实现动态查询。

1、方式一:EXECUTE IMMEDIATE

--传递并检索值(INTO子句用在USING子句前):
CREATE OR REPLACE FUNCTION dynamic_f()
RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE 
   d_id       INT := 2;
   d_name     VARCHAR(20);
   d_salary   INT;
BEGIN
   EXECUTE IMMEDIATE 'SELECT name,salary FROM company1 WHERE id = :1' INTO d_name,d_salary USING IN d_id;
	 RETURN '姓名:' || d_name || ' , 薪水:¥' ||d_salary;
END $$;


--执行
CALL dynamic_f();

主要属性说明:

INTO的变量 :用于指定存放单行查询结果的变量。
USING IN的变量: 用于指定存放传递给动态SQL值的变量,在SQL拼接时可用占位符,占位符命名以“:”开始,后面可跟数字、字符或字符串,与USING子句的变量一一对应。
执行结果:

2、方式二:OPEN FOR

--使用OPEN FOR打开动态游标来执行
CREATE OR REPLACE FUNCTION dynamic_cur()
RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
    v_name          VARCHAR2(20);
    v_salary        INT;    

    TYPE ref_type IS REF CURSOR;  --定义游标类型
    my_cur ref_type;              --定义游标变量
    
BEGIN
    OPEN my_cur FOR 'SELECT name,salary FROM company1 WHERE id = :1' USING '3';   --打开游标, using是可选的
    FETCH my_cur INTO v_name, v_salary; --获取数据
    WHILE my_cur%FOUND 
		LOOP
        RETURN v_name||'#'||v_salary;
        FETCH my_cur INTO v_name, v_salary;
    END LOOP;
    CLOSE my_cur;   --关闭游标
END $$;

--执行
CALL dynamic_cur();

主要属性说明

'WHILE my_cur%FOUND': 是一个循环控制语句。'my_cur'是一个游标,而'%FOUND'是游标状态。当游标找到符合条件的记录时,这个状态就会为真(也就是说,如果'my_cur%'FOUND为真,那么就继续执行循环中的代码)。当游标没有更多的记录可返回时(或者达到了游标返回的最大记录数),这个状态就会为假,然后循环就会停止。所以,'WHILE my_cur%FOUND'的意思是:当游标'my_cur'还有记录可返回时,就继续执行循环中的代码。

执行结果

四、GaussDB中的动态非查询语句(示例)
其实这个可以简单的理解为非“SELECT语句”,基本写法跟前面的示例类似,下面继续以company1表为例:

--使用EXECUTE IMMEDIATE执行动态非查询语句
CREATE OR REPLACE FUNCTION dynamic_cur()
RETURNS void
LANGUAGE plpgsql
AS $$
DECLARE 
   v_id       INT := 4; 
   v_name     VARCHAR2(10) := 'ZhangSan'; 
   v_age      INT := 30;
	 v_address  VARCHAR2(10) := 'BeiJing'; 
   v_salary   INT := 30000;
	 v_newname   VARCHAR2(10) := 'company4';
BEGIN 
    EXECUTE IMMEDIATE 'INSERT INTO company1 VALUES(:1, :2, :3, :4, :5)' USING v_id, v_name, v_age,v_address,v_salary; 
    EXECUTE IMMEDIATE 'ALTER TABLE company1 RENAME to ' || v_newname;
		
END $$;

--执行
CALL dynamic_cur();

--查看结果
SELECT * FROM company4;
执行结果

五、小结
通过使用GaussDB数据库构建动态SQL语句,数据应用部门可以更好地应对不断变化的数据查询需求,提高应用程序的性能和可维护性。本文主要介绍了如何使用GaussDB数据库构建动态SQL语句的基本步骤和注意事项,并通过实际案例进行了演示,欢迎大家测试、交流。

——结束

​https://support.huaweicloud.com/intl/zh-cn/gaussdb/index.html

标签:语句,--,GaussDB,游标,查询,SQL
From: https://www.cnblogs.com/xiaoxu0211/p/18439260

相关文章

  • GaussDB SQL基础语法-变量&常量
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。二、GaussDB数据库中的常量和变量的基本概述及语法定义数据库中的变量和常量是两种重要的数据......
  • GaussDB SQL基础语法示例-GOTO语句
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。GOTO语句是直观基本的控制流语句,会导致控制流发生无条件更改。它用于分流至使用SQL过程中定......
  • GaussDB技术解读系列:HTAP方向的探索与发展
    ​什么是HTAP?本篇为大家分享《GaussDB在HTAP上的探索和发展》。首先,我们看一下TP和AP的特点。TP一般是做交易型的业务,它的数据量通常来说比较小,在GB~TB的范围内,它要求低时延、高吞吐,同时对高可用、故障恢复要求较高。AP一般用于对历史数据做分析,根据数据分析的结论为企业的商业......
  • GaussDB SQL基本语法示例-CASE表达式
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。二、CASEExpression(CASE表达式)介绍在GaussDBSQL中,CASE表达式(CASEExpression)是一个非常强大......
  • (赠源码)Python+django+echars+MySQL+爬虫+大屏 boss直聘数据分析可视化系统的设计与实
    摘要随着互联网的飞速发展和技术的不断进步,数据分析和可视化技术在各个领域都扮演着越来越重要的角色。在人才招聘领域,招聘平台作为连接求职者和招聘公司的重要平台,需要不断创新和提升服务体验。设计和实现一个boss直聘数据分析可视化系统,可以帮助BOSS直聘平台更好地利用数......
  • java+springboot+mysql新闻信息检索系统59739-计算机毕业设计原创定制(赠源码)
                                           目 录摘要1绪论1.1选题背景1.2研究意义1.3系统开发技术的特色1.4springboot框架21.5论文结构与章节安排32 新闻信息检索系统分析......
  • MYSQL DML 修改和删除数据
    点击查看代码UPDATEemployeeSETNAME='itheima'WHEREid=1;--更改id1的name为SELECT*FROMemployee;UPDATEemployeeSETNAME='小昭',gender='女'WHEREid=1;--更改ID1的name和ganderSELECT*FROMemployee;UPDATEemployeeSETe......
  • #1064-You hare an error in your SQL syntar:check the nanual that corresponds to y
    静态分析:分析时发现6个错误。1.不应出现的开始声明。(near“44”“atposition1)2,不应出现的开始声明。(near”‘use_polyfill“atposition6)3,不应出现的开始声明。(near”‘O‘“atposition21)4,不应出现的开始声明。(near”2“”atposition25)5.不应出现的开始声明。......
  • mysql数据库多表查询
    单表查询1、普通查询(1)命令:select*from<表名>;//通匹(2)命令:select<要查询的字段>from<表名>;2、去重查询(distinct)命令:selectdistinct<要查询的字段>from<表名>3、排序查询(orderby)升序:asc降序:desc降序排列命令:select<要查询的字段名>from<表名>orderby<要查......
  • MySQL登录时出现ERROR 1045: Access denied for user ‘root‘@‘localhost‘ (using p
    Mysql在使用过程中,可能会遇到登录问题,比如常见的错误信息:“Accessdeniedforuser‘root’@‘localhost’(usingpassword:YES)”。本文将分析这个问题的可能原因,并提供一系列解决方案. 定位报错原因出现这个Accessdenied问题的原因有如下可能:MySQL的服务器停止了。......