• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

mysql 搞代码 4年前 (2022-01-09) 26次浏览 已收录 0个评论

简单的存储过程各个关键字的用法:

CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(in _xnb varchar(50))BEGIN	## 定义变量	DECLARE _num FLOAT(14,6) DEFAULT 0;	## @表示全局变量 相当于php $	## 拼接赋值 INTO 必须要用全局变量不然语句会报错    ## //CONCAT会把'SELECT SUM('和_xnb和') INTO @tnum FROM btc_user_coin'拼接起来,CONCAT的各个参数中间以","号分割	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 _numEND;;

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

Mysql 5.0 以后,支持了动态sql语句,我们可以通过传递不同的参数得到我们想要的值

这里介绍两种在存储过程中的动态sql

1.set sql = (预处理的sql语句,可以是用concat拼接的语句)

 set @sql = sql

 PREPARE stmt_name FRO

本文来源gaodai^.ma#com搞#代!码网

M @sql;

 EXECUTE stmt_name;

 {DEALLOCATE | DROP} PREPARE stmt_name;

过程过程示例:

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的值,如下:

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拼接的语句,参数用 ?代替)


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql 存储过程中使用动态sql语句

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址