当前位置: 代码迷 >> 综合 >> mysql 存储过程中的 prepare语句
  详细解决方案

mysql 存储过程中的 prepare语句

热度:92   发布时间:2024-02-19 20:25:11.0

prepare语法格式:

PREPARE stmt from 'sql语句';
#EXECUTE stmt; #适用sql无参数
EXECUTE stmt (如果sql有参数的话, USING xxx,xxx); // 这里USING的只能是会话变量(提前定义好的便令作为参数)
DEALLOCATE PREPARE stmt; #释放数据库连接

作用:

  1. 可以在存储过程中写一些ddl语句(不建议,因为ddl操作会锁表,所以不建已在存储过程中更改表结构)
  2. 可以在存储过程中动态的拼接表名,字段名,来达到动态查询的效果
  3. sql语句中还可以用?来代表参数,这样可以有效的防止sql注入

示例:

delimiter //
create procedure myTest()
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 //

调用上面的存储过程,会得到11的结果,就是这么简单,关于存储过程我的其他博客里面有,可以去看,值得一提的是,如果是要动态的选择表名,表名并不能用 ? 来当占位符。我们只能采用字符串拼接的方法

delimiter //
create procedure myTest(in columnName varchar(32)) // 传入一个字符串
BEGIN
drop table if exists tmpTable; // 如果临时表存在先删除掉
set @_sql = concat('create temporary table if not exists tmpTable( ', columnName, ' varchar(32), id int(11), _name varchar(32));'); // 创建临时表的语法,我们把传入的参数拼接进来
PREPARE stmt from @_sql;    
EXECUTE stmt;
DEALLOCATE PREPARE stmt;  // 执行
desc tmpTable;
end //

 以上存储过程我们可以看到我们传入的字符串可以动态的添加到临时表里面去。 

创建临时表时还可以直接从结果集创建。

create table table_tempname select * from table_name where 1=2; (where条件不成立是复制表,条件成立是复制表和数据)

或者create table table_tempname like table_name;

 

  相关解决方案