MySQL 预处理语句prepare、execute、deallocate的使用,执行动态sql

Mysql出现问题:ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger解决方案 阅读详情

MySQL官方将prepare、execute、deallocate统称为PREPARE STATEMENT。
我习惯称其为【预处理语句】。

其用法十分简单,

PREPARE stmt_name FROM preparable_stmt

EXECUTE stmt_name
 [USING @var_name [, @var_name] ...] -

{DEALLOCATE | DROP} PREPARE stmt_name


举个栗子:

mysql> PREPARE pr1 FROM 'SELECT ?+?';
Query OK, 0 rows affected (0.01 sec)
Statement prepared

mysql> SET @a=1, @b=10 ;
Query OK, 0 rows affected (0.00 sec)

mysql> EXECUTE pr1 USING @a, @b;
+------+
| ?+? |
+------+
| 11 |
+------+
1 row in set (0.00 sec)

mysql> EXECUTE pr1 USING 1, 2; -- 只能使用用户变量传递。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the 
right syntax to use near '1, 2' at line 1

mysql> DEALLOCATE PREPARE pr1;
Query OK, 0 rows affected (0.00 sec)


使用PAREPARE STATEMENT可以减少每次执行SQL的语法分析,
比如用于执行带有WHERE条件的SELECT和DELETE,或者UPDATE,或者INSERT,只需要每次修改变量值即可。
同样可以防止SQL注入,参数值可以包含转义符和定界符。

适用在应用程序中,或者SQL脚本中均可。

更多用法:

同样PREPARE ... FROM可以直接接用户变量:

mysql> CREATE TABLE a (a int);
Query OK, 0 rows affected (0.26 sec)

mysql> INSERT INTO a SELECT 1;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> INSERT INTO a SELECT 2;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> INSERT INTO a SELECT 3;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> SET @select_test = CONCAT('SELECT * FROM ', @table_name);
Query OK, 0 rows affected (0.00 sec)

mysql> SET @table_name = 'a';
Query OK, 0 rows affected (0.00 sec)

mysql> PREPARE pr2 FROM @select_test;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE pr2 ;
+------+
| a |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)

mysql> DROP PREPARE pr2; -- 此处DROP可以替代DEALLOCATE
Query OK, 0 rows affected (0.00 sec)


每一次执行完EXECUTE时,养成好习惯,须执行DEALLOCATE PREPARE … 语句,这样可以释放执行中使用的所有数据库资源(如游标)。
不仅如此,如果一个session的预处理语句过多,可能会达到max_prepared_stmt_count的上限值。

预处理语句只能在创建者的会话中可以使用,其他会话是无法使用的。
而且在任意方式(正常或非正常)退出会话时,之前定义好的预处理语句将不复存在。
如果在存储过程中使用,如果不在过程中DEALLOCATE掉,在存储过程结束之后,该预处理语句仍然会有效。

MySQL 存储过程中执行动态SQL语句的方法 drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure() BEGIN declare my_sqll varchar(500); set my_sqll='select * from aa_list'; set @ms=my_sqll; PREPARE s1 from @ms; EXECUTE s1; deallocate prepare s1; end; 您可能感兴趣的文章:mysql 存储过程中变量的定义与赋值操作mysql存储过程详解mysq 立即下载

相关推荐

SOLIDWORKS Flow Simulation 颗粒分离器仿真:从流场分析到分离效率优化

计算流体力学(CFD)是研究流体流动、传热及相关物理现象的核心工具,其基本原理是通过数值方法求解控制流体运动的纳维-斯托克斯方程。在工程实践中,CFD的价值在于能够对复杂流动进行高保真度仿真,从而在产品设计阶段预测性能、优化结构,显著降低物理样机的试制成本和周期。颗粒分离器作为环保、化工、矿业等领域的关键设备,其设计核心在于平衡分离效率与压力损失。借助SOLIDWORKS内嵌的Flow Simulation模块,工程师可以高效地执行流体仿真,特别是对涉及离散相的颗粒运动进行轨迹追踪和效率统计。该技术方案通过

weixin_28709649的博客 325

sql中deallocate是什么

DEALLOCATE删除游标引用。当释放最后的游标引用时,组成该游标的数据结构由 Microsoft® SQL Server™ 释放。语法DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }参数cursor_name是已声明游标的名称。当全局和局部游标都以 cursor_name 作为它们的名称存在时,如果指定 GLOB...

爱码农爱生活 1296

【Linux】实际项目应该如何完成?--安防监控系统项目的总结

到目前为止我也做个5、6个嵌入式项目,但以往都是从零开始自己做,也就是毫无计划,想到那里做那里,有想法就会去实现,就这样导致我碰到了很多坑,也消耗了我许多时间,当然,不是说这样不好,因为在其中我也得到了一个很好的锻炼与练习,但是这不适用于在工作中去这样做。...

修成真的博客 6729

MySQL DEALLOCATE命令使用示例:管理预处理语句的生命周期

在MySQL中,DEALLOCATE是用于管理预处理语句的一个命令,它用于释放之前通过PREPARE语句准备好的预处理语句所占用的资源。预处理语句是一种优化手段,允许你编译一条SQL语句一次,然后用不同的参数多次执行,这在执行大量相似查询时可以提高效率并增强安全性。以下是关于MySQL中DEALLOCATE。

学亮编程手记 1174

目标检测中的困难样本挖掘:YOLOv5训练效果提升30%的秘诀

本文深入探讨了目标检测中困难样本挖掘的关键技术,特别是如何通过在线困难样本挖掘(OHEM)策略显著提升YOLOv5模型的性能。文章详细解析了困难样本的分类、识别机制及实战配置,并提供了数据标注策略与增强技巧,最终实现模型性能提升30%的突破。

weixin_30379531的博客 402

RustFS vs MinIO:深入对比分布式存储的性能、功能与选型指南

RustFS与MinIO是两款热门分布式存储系统,分别针对高性能与通用场景设计。RustFS基于Rust语言,在吞吐量(最高提升46%)、延迟(降低37%)和资源效率(内存占用减少67%)上显著优于MinIO,适合AI训练、金融级应用等高性能需求。MinIO凭借成熟的S3兼容性、云原生集成和企业级功能,更适用于混合云及现有S3生态。许可方面,RustFS采用Apache 2.0,MinIO为AGPLv3。选型建议:优先RustFS应对性能敏感场景,选择MinIO注重生态兼容性,也可考虑混合架构策略。

分布式存储与RustFS的博客 2023

MySQL高级篇——存储过程以及语法

存储过程就是一条或者多条SQL语句的集合,可以视为批文件,它可以定义批量插入的语句,也可以定义一个接收不同条件的SQL。

智码未来:AI与Java全栈的跨界对话 1331

大模型——Ollama简明教程

在这篇文章中,我们将了解如何使用 Ollama、如何在 Ollama 中创建自己的模型 以及如何使用 Ollama 构建聊天机器人。这是深入研究 Ollama 的第一部分,以及我所学到的有关本地 LLM 的知识以及如何将它们用于基于推理的应用程序。在这篇文章中,你将了解——

1692

MySQL进阶--数据库存储过程

存储过程 存储程序就是一行或者多行sql语句。 为以后的使用而保存的一条或多条MySQL语句的集合。 存储过程思想上就是数据库 SQL 语言层面的代码封装与重用 (一)存储过程的创建 存储过程和函数的构建,数据库提供了CREATE PROCEDURE和CREATE FUNCTION语法,创建的存储过程和函数可以在SQL语句中被调用执行,或者可以在其他的存储过程或者函数调用执行,本节内容先掌握基本的创建语法。 (1) 创建存储过程 CREATE PROCEDURE proc_name存储过程的名字([pro

寒江之雪,披蓑独钓的博客 225

【CANoe】CANoe的 I/O功能-以VN1640A为例

Canoe的 I/O功能-以VN1640A为例

星Yeah 的博客 7877

网络安全与黑客攻防常见设备:前置机、跳板机、堡垒机与肉鸡

前置机、跳板机、堡垒机和肉鸡,这些看似冷僻的技术名词,实则是网络安全与黑客攻防战中的关键角色。它们有的守护着企业的数字Pltform,保卫网络安全;有的则成为黑客的跳板,游走于灰色地带。

网络技术联盟站 963

mysql 存储过程中使用动态sql语句

简单的存储过程各个关键字的用法: CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(in _xnb varchar(50)) BEGIN ## 定义变量 DECLARE _num FLOAT(14,6) DEFAULT 0; #...

813

基于STM32LXXX的模数转换芯片ADC(TLA2528IRTER)驱动C程序设计

define TLA2528_ADDR 0x12 << 1 // 用于HAL传输的8位地址(写入为0x24,读取为0x25)// 100kHz (示例值,需根据实际时钟计算)#define TLA2528_REG_PIN_CFG 0x00 // 引脚配置寄存器。#define TLA2528_REG_CHN_SEL 0x01 // 通道选择寄存器。

myron6688的博客 230

MySQL数据库存储过程动态表建立(PREPARE)

PREPAREstatement_nameFROMsql_text/*定义*/EXECUTEstatement_name[USINGvariable[,variable...]]/*运行预处理语句*/DEALLOCATEPREPAREstatement_name/*删除定义*/ 这是我项目其中用到的,用作參考使用:DELIMITER $$ DR...

aoe41606的博客 190

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

mysql prepare多条命令_mysql prepare语句使用

语法PREPAREstatement_nameFROMsql_text/*定义*/EXECUTEstatement_name[USINGvariable[,variable...]]/*执行预处理语句*/DEALLOCATEPREPAREstatement_name/*删除定义*/例mysql>PREPAREprodFROM"INSERTINTOexaml...

weixin_33103945的博客 1205

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

from用法 prepare_mysql prepare语句使用

语法PREPAREstatement_nameFROMsql_text/*定义*/EXECUTEstatement_name[USINGvariable[,variable...]]/*执行预处理语句*/DEALLOCATEPREPAREstatement_name/*删除定义*/例mysql>PREPAREprodFROM"INSERTINTOexaml...

weixin_39650756的博客 294

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

mysql存储过程prepare_MySQL数据库存储过程动态表建立(PREPARE)

PREPAREstatement_nameFROMsql_text/*定义*/EXECUTEstatement_name[USINGvariable[,variable...]]/*运行预处理语句*/DEALLOCATEPREPAREstatement_name/*删除定义*/这是我项目其中用到的,用作參考使用:DELIMITER $$DROP PROCEDURE IF E...

weixin_29384861的博客 410

mysql 存储过程 动态参数 查询执行结果

mysql function & procedure 学习使用小结: 1、动态sql, 即动态参数: 在存储过程中,想要直接用表名变量做参数,动态执行sql,不能直接写 1 2 3 4 5 6 7 create procedure ( $tableName char(20) )  

lhorse003的博客 4283

mysql - prepare预处理/动态sql/动态语句

目录 1.预制语句的SQL语法基于三个SQL语句 2.可预处理的SQL语句 1.预制语句的SQL语法基于三个SQL语句 PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @var_name] ...]; {DEALLOCATE | DROP} PREPARE stmt_name; PREPARE语句用于预备一个语句,并赋予它名称stmt_name,借此在以后引用该语句。 EXE...

开码河粉 1667

mysql存储过程动态sql

mysql存储过程中,变量直接拼接在执行sql上会把变量解析成 '变量执行',比如: DECLARE v_conditionVARCHAR(4) DEFAULT 'id=1'; select * from t wherev_condition 此时不会报错,实际执行的sql是select * from t where 'id=1' 所以需要动态sql的实现如下,这里动态SQL的生成说明如下: 使用concat拼接,将变量传值进去: set pSql = concat('update...

yonghutwo的专栏 3271

MySQL预处理 - Prepared Statements

最近在使用存储过程定时创建分区的时候,使用到了预处理相关语句,在此记录一下MySQL的预处理语句使用,方便自己和大家查阅,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢! MySQL预处理通常使用 PREPARE、EXECUTE 和 DEALLOCATE PREPARE三个语句来进行处理。 PREPARE 语句 语法: PREPARE stmt_name FROM preparable_stmt prepare:该prepare语句准备一条S.

FAIRYTAIL的博客 1925

deallocate mysql_MySQL 预处理语句prepare、execute、deallocate的使用

语法PREPARE stmt_name FROM preparable_stmtEXECUTE stmt_name[USING @var_name [, @var_name] ...] -{DEALLOCATE | DROP} PREPARE stmt_name示例mysql> PREPARE pr1 FROM 'SELECT ?+?';Query OK, 0 rows affecte...

weixin_33892912的博客 253

mysql limit动态赋值 / sql拼接,预处理语句解析

预处理语句使用函数解析 预处理语句,limit动态赋值示例 预处理语句使用函数解析       prepare:             PREPARE name FROM preparable_stmt(“预定...

loney_wolf的博客 2560

mysql存储过程用表名做参数 并获取execute执行语句的结果

话不多说,先上代码: DROP PROCEDURE IF EXISTS countTableRows; CREATE PROCEDURE countTableRows(IN tableName VARCHAR(10),OUT count INT) BEGIN SET @sql = CONCAT('SELECT COUNT(*) INTO @count FROM ', tableName); PRE...

Fickle_actor的博客 1万+

MySQL用户变量-预处理语句(动态语句用法)

MySQL用户变量-预处理语句(动态语句用法)

中国风 3343
上一篇: MySql 存储过程 语句无报错,临时表 无法插入数据
下一篇: linux 安装jdk解压报错
普通网友
博客等级 码龄12年 15粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值