mysql带入参的存储过程_MySQL 带参数的存储过程(动态执行SQL语句)

MySQL5.0 以后,支持动态sql语句。

当SQL语句中 字段名,表名,数据库名等 要作为变量时,必须要使用动态SQL。

MySQL动态SQL语法如下:

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

set @sql = sql //你的sql语句

PREPARE stmt FROM @sql;

EXECUTE stmt (如果sql有参数的话, USING xxx,xxx); // 这里USING的只能是会话变量;

DEALLOCATE PREPARE stmt;

1、 定义要执行的sql变量,并为其赋值

2、预定义好要使用的sql.

3、执行预定义的sql

4、释放掉数据库连接

实例1:

delimiter //

create procedure pro_test()

begin

set @_sql = 'select ? + ?';

set @a = 5;

set @b = 6;

PREPARE stmt from @_sql; // 预定义sql

EXECUTE stmt USING @a,@b;// 传入两个会话变量来填充sql中的 ?

DEALLOCATE PREPARE stmt; // 释放连接

end //

调用:

call pro_test();

返回结果:11

实例2:

delimiter //

CREATE PROCEDURE pro_stu(in order_param VARCHAR(50),in startindex int ,in size int)

BEGIN

set @v_sql = "select * from student s ORDER BY ? LIMIT ?,?";

PREPARE stmt from @v_sql;

set @a = order_param;

set @b = startindex;

set @c = size;

EXECUTE stmt using @a,@b,@c;

DEALLOCATE PREPARE stmt;

end//

delimiter;

调用:

call pro_stu('s.s_no desc',0,20);

输出结果:

image.png

注意:MySQL 在存储过程中是不支持直接使用变量名作为表名或者是列名的,而在实际的应用中确实会用到变表名或者变量名的情况。以下实例简单说明动态表名、列名的查询。

实例3:

DROP PROCEDURE IF EXISTS select_test;

delimiter //

create PROCEDURE select_test(tableName varchar(20))

-- 创建存储过程 命名为tests

BEGIN -- 存储过程的开始

set @tableNames = CONCAT(tableName); -- @先在用户变量中保存值然后在以后引用它

set @v_sql = CONCAT('select * from ',@tableNames);-- 拼接查询总记录的SQL语句

prepare stmt from @v_sql; -- 预定义一个语句,并将它赋给 stmt

execute stmt ; -- 执行语句

deallocate prepare stmt;-- 要释放一个预定义语句的资源

end//-- 存储过程的结束

delimiter;

调用:

call select_test('student');

实例4:

DROP PROCEDURE IF EXISTS myTest1;

delimiter //

create procedure myTest1(in columnName varchar(50)) -- 传入一个字符串

BEGIN

drop table if exists tmpTable; -- 如果临时表存在先删除掉

set @_sql = concat('create temporary table if not exists tmpTable( ', columnName, ' varchar(50), id int(15), name varchar(50));'); -- 创建临时表的语法,我们把传入的参数拼接进来

PREPARE stmt from @_sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt; -- 执行

desc tmpTable;

end //

调用:

call myTest1('password');

输出结果:

image.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值