本文摘自PHP中文网,作者步履不停,侵删。
简单的存储过程各个关键字的用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(in _xnb varchar(50))
BEGIN
## 定义变量
DECLARE _num FLOAT(14,6) DEFAULT 0;
## @表示全局变量 相当于php $
## 拼接赋值 INTO 必须要用全局变量不然语句会报错
##
SET @strsql = CONCAT( 'SELECT SUM(' ,_xnb, ') INTO @tnum FROM btc_user_coin' );
## 预处理需要执行的动态SQL,其中stmt是一个变量
PREPARE stmt FROM @strsql;
## 执行SQL语句
EXECUTE stmt;
## 释放掉预处理段
deallocate prepare stmt;
## 赋值给定义的变量
SET _num = @tnum;
SELECT _num
END ;;
|
Mysql 5.0 以后,支持了动态sql语句,我们可以通过传递不同的参数得到我们想要的值
这里介绍两种在存储过程中的动态sql
1.set sql = (预处理的sql语句,可以是用concat拼接的语句)
set @sql = sql
PREPARE stmt_name FROM @sql;
EXECUTE stmt_name;
{DEALLOCATE | DROP} PREPARE stmt_name;
过程过程示例:
1 2 3 4 5 6 7 8 9 | CREATE DEFINER = `root`@`%` PROCEDURE `NewProc`(IN `USER_ID` varchar(36),IN `USER_NAME` varchar(36))BEGIN
declare SQL_FOR_SELECT varchar(500); -- 定义预处理sql语句
set SQL_FOR_SELECT = CONCAT( "select * from user where user_id = '" ,USER_ID, "' and user_name = '" ,USER_NAME, "'" ); -- 拼接查询sql语句
set @sql = SQL_FOR_SELECT; PREPARE stmt FROM @sql; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
deallocate prepare stmt; -- 释放prepareEND;
|
上述是一个简单的查询用户表的存储过程,当我们调用此存储过程,可以根据传入不同的参数获得不同的值。
但是:上述存储过程中,我们必须在拼接sql语句之前把USER_ID,USER_NAME定义好,而且在拼接sql语句之后,我们无法改变USER_ID,USER_NAME的值,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | CREATE DEFINER = `root`@`%` PROCEDURE `NewProc`(IN `USER_ID` varchar(36),IN `USER_NAME` varchar(36))BEGIN
declare SQL_FOR_SELECT varchar(500); -- 定义预处理sql语句
set SQL_FOR_SELECT = CONCAT( "select * from user where user_id = '" ,USER_ID, "' and user_name = '" ,USER_NAME, "'" ); -- 拼接查询sql语句
set @sql = SQL_FOR_SELECT; PREPARE stmt FROM @sql; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare
set USER_ID = '2' ; -- 主动指定参数USER_ID的值
set USER_NAME = 'lisi' ; set @sql = SQL_FOR_SELECT; PREPARE stmt FROM @sql; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
deallocate prepare stmt; -- 释放prepareEND;
|
我们用call aa('1','zhangsan');来调用该存储过程,第一次动态执行,我们得到了‘张三’的信息,然后我们在第14,15行将USER_ID,USER_NAME改为lisi,我们希望得到李四的相关信息,可查出来的结果依旧是张三的信息,说明我们在拼接sql语句后,不能再改变参数了。
为了解决这种问题,下面介绍第二中方式:
2.set sql = (预处理的sql语句,可以是用concat拼接的语句,参数用 ?代替)
set @sql = sql
PREPARE stmt_name FROM @sql;
set @var_name = xxx;
EXECUTE stmt_name USING [USING @var_name
[, @var_name
] ...];
{DEALLOCATE | DROP} PREPARE stmt_name;
上述的代码我们就可以改成 :
阅读剩余部分
相关阅读 >>
如何将node.js与mysql连接?
最全的mysql调试与优化技巧
mysql数据库查询操作xml的经验分享
mysql百万级数据量分页查询方法及其优化建议
关于mysql时常闪退的问题解决办法分享(图)
mysql发生错误如何处理
数据库删除语句delete有什么用?
python操作mysql数据库的简单步骤分享
mysql之调优概论
mysql安装在哪儿怎么查看?
更多相关阅读请进入《mysql》频道 >>
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » mysql 存储过程中使用动态sql语句