存储过程加入动态sql

2024-09-02 04:48

本文主要是介绍存储过程加入动态sql,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.创建不带参数的存储过程

drop PROCEDURE if exists my_procedure; 

create PROCEDURE my_procedure() 
BEGIN
DECLARE my_sql VARCHAR(2000);
  set my_sql='SELECT order_info.* FROM order_info WHERE 1 = 1 '; 
 SET @sql1=my_sql;
 PREPARE stmt1 FROM @sql1;
 EXECUTE stmt1;
 DEALLOCATE PREPARE stmt1 ;
end;

CALL my_procedure();


2.创建带参数的存储过程


drop PROCEDURE if exists my_procedure; 


create PROCEDURE my_procedure(IN marketName VARCHAR(100)) 
BEGIN
DECLARE my_sql VARCHAR(2000);
  set my_sql='SELECT order_info.* FROM order_info WHERE 1 = 1 '; 
 IF marketName IS NOT NULL THEN
SET my_sql=CONCAT(my_sql,'AND order_info.market_name LIKE "%',marketName,'%" ');
 END IF;
 SET @sql1=my_sql;
 PREPARE stmt1 FROM @sql1;
 EXECUTE stmt1;
 DEALLOCATE PREPARE stmt1 ;
end;

CALL my_procedure('上海');


3.创建带多参数的单表存储过程

create PROCEDURE my_procedure(IN marketName VARCHAR(100),IN brandName VARCHAR(100),IN seriesName VARCHAR(100),
IN beginDate VARCHAR(100),IN endDate VARCHAR(100),IN startIndex INT(6),IN endIndex INT(6)) 
BEGIN
DECLARE my_sql VARCHAR(2000);
  set my_sql='SELECT order_info.* FROM order_info WHERE 1 = 1 '; 

IF (marketName <> NULL OR marketName <>'') THEN
SET my_sql=CONCAT(my_sql,'AND order_info.market_name LIKE "%',marketName,'%" ');
END IF;

IF (brandName <> NULL OR brandName <>'') THEN
SET my_sql=CONCAT(my_sql,'AND order_info.brand_name LIKE "%',brandName,'%" ');
END IF;

IF (seriesName <> NULL OR seriesName <>'') THEN
SET my_sql=CONCAT(my_sql,'AND order_info.series_name LIKE "%',seriesName,'%" ');
END IF;

IF ((beginDate <> NULL OR beginDate <>'') AND (endDate <> NULL OR endDate <>'')) THEN
SET my_sql=CONCAT(my_sql,'and order_info.order_time between ',"'",beginDate,"'",' and ',"'",endDate,"'");
END IF;

SET my_sql=CONCAT(my_sql,' group by order_info.id order by order_info.market_no,order_info.order_sn ',' LIMIT ',startIndex,',',endIndex);

 SET @sql1=my_sql;
 PREPARE stmt1 FROM @sql1;
 EXECUTE stmt1;
 DEALLOCATE PREPARE stmt1;
end;

CALL my_procedure('上海','',NULL,'2015-06-14','2015-07-11',20,80);


4.创建带多参数的多表存储过程(本例为两表)

create PROCEDURE my_procedure(IN pdtType VARCHAR(100),IN pdtCode VARCHAR(100),IN pdtName VARCHAR(100),
IN marketName VARCHAR(100),IN brandName VARCHAR(100),IN seriesName VARCHAR(100),
IN beginDate VARCHAR(100),IN endDate VARCHAR(100),IN startIndex INT(6),IN endIndex INT(6)) 
BEGIN
DECLARE my_sql VARCHAR(2000);
  set my_sql='SELECT order_info.* FROM order_info '; 

IF ((pdtType <> NULL OR pdtType <>'') OR (pdtCode <> NULL OR pdtCode <>'') OR (pdtName <> NULL OR pdtName <>'')) THEN
SET my_sql=CONCAT(my_sql,'inner join order_item oi on oi.market_no = order_info.market_no and oi.order_sn =order_info.order_sn ');

IF (pdtType <> NULL OR pdtType <>'') THEN
SET my_sql=CONCAT(my_sql,'and oi.pdt_type LIKE "%',pdtType,'%" ');
END IF;

IF (pdtCode <> NULL OR pdtCode <>'') THEN
SET my_sql=CONCAT(my_sql,'and oi.pdt_code =',pdtCode);
END IF;

IF (pdtName <> NULL OR pdtName <>'') THEN
SET my_sql=CONCAT(my_sql,'and oi.pdt_name LIKE "%',pdtName,'%" ');
END IF;

END IF;

SET my_sql=CONCAT(my_sql,' WHERE 1 = 1 ');


IF (marketName <> NULL OR marketName <>'') THEN
SET my_sql=CONCAT(my_sql,'AND order_info.market_name LIKE "%',marketName,'%" ');
END IF;

IF (brandName <> NULL OR brandName <>'') THEN
SET my_sql=CONCAT(my_sql,'AND order_info.brand_name LIKE "%',brandName,'%" ');
END IF;

IF (seriesName <> NULL OR seriesName <>'') THEN
SET my_sql=CONCAT(my_sql,'AND order_info.series_name LIKE "%',seriesName,'%" ');
END IF;

IF ((beginDate <> NULL OR beginDate <>'') AND (endDate <> NULL OR endDate <>'')) THEN
SET my_sql=CONCAT(my_sql,'and order_info.order_time between ',"'",beginDate,"'",' and ',"'",endDate,"'");
END IF;

SET my_sql=CONCAT(my_sql,' group by order_info.id order by order_info.market_no,order_info.order_sn ',' LIMIT ',startIndex,',',endIndex);

 SET @sql1=my_sql;
 PREPARE stmt1 FROM @sql1;
 EXECUTE stmt1;
 DEALLOCATE PREPARE stmt1;
end;

CALL my_procedure('GP','015130844',NULL,'','',NULL,'2015-06-14','2015-07-11',0,80);


5.创建参数为DECIMAL类型的存储过程

create PROCEDURE my_procedure(IN minAmount DECIMAL(20,6),IN maxAmount DECIMAL(20,6)) 
BEGIN
DECLARE my_sql VARCHAR(2000);
  set my_sql='SELECT order_info.* FROM order_info WHERE 1 = 1 '; 
IF (minAmount IS NOT NULL) THEN
SET my_sql=CONCAT(my_sql,'AND order_info.order_amount>=',minAmount);
END IF;

IF (maxAmount IS NOT NULL) THEN
SET my_sql=CONCAT(my_sql,' AND order_info.order_amount<=',maxAmount);
END IF;

SET my_sql=CONCAT(my_sql,' group by order_info.id order by order_info.market_no,order_info.order_sn ');

 SET @sql1=my_sql;
 PREPARE stmt1 FROM @sql1;
 EXECUTE stmt1;
 DEALLOCATE PREPARE stmt1;
end;

CALL my_procedure(5000.999999,NULL);

这篇关于存储过程加入动态sql的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129038

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND