语法

[sql]

PREPARE statement_name FROM sql_text /*定义*/

EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/

DEALLOCATE PREPARE statement_name /*删除定义*/

[sql]

mysql> PREPARE prod FROM "INSERT INTO examlple VALUES(?,?)";

mysql> SET @p='1';

mysql> SET @q='2';

mysql> EXECUTE prod USING @p,@q;

mysql> SET @name='3';

mysql> EXECUTE prod USING @p,@name;

mysql> DEALLOCATE PREPARE prod;

1.用变量做表名: 简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名。在其他的sql数据库中也是如 此,mssql的解决方法是将整条sql语句作为变量,其中穿插变量作为表名,然后用sp_executesql调用该语句。 这在mysql5.0之前是不行的,5.0之后引入了一个全新的语句,可以达到类似sp_executesql的功能(仅对procedure有 效,function不支持动态查询):

PREPARE stmt_name FROM preparable_stmt;

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

{DEALLOCATE | DROP} PREPARE stmt_name;

为了有一个感性的认识,下面先给几个小例子:

[sql]

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';

mysql> SET @a = 3;

mysql> SET @b = 4;

mysql> EXECUTE stmt1 USING @a, @b;

+------------+

| hypotenuse |

+------------+

| 5 |

+------------+

mysql> DEALLOCATE PREPARE stmt1;

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';

mysql> PREPARE stmt2 FROM @s;

mysql> SET @a = 6;

mysql> SET @b = 8;

mysql> EXECUTE stmt2 USING @a, @b;

+------------+

| hypotenuse |

+------------+

| 10 |

+------------+

mysql> DEALLOCATE PREPARE stmt2;

如果你的MySQL 版本是 5.0.7 或者更高的,你还可以在 LIMIT 子句中使用它,示例如下:

[sql]

mysql> SET @a=1;

mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";

mysql> EXECUTE STMT USING @a;

mysql> SET @skip=1; SET @numrows=5;

mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";

mysql> EXECUTE STMT USING @skip, @numrows;

使用 PREPARE 的几个注意点:

A:PREPARE stmt_name FROM preparable_stmt;预定义一个语句,并将它赋给 stmt_name ,tmt_name 是不区分大小写的。

B: 即使 preparable_stmt 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。

C: 如果新的 PREPARE 语句使用了一个已存在的 stmt_name ,那么原有的将被立即释放! 即使这个新的 PREPARE 语句因为错误而不能被正确执行。

D: PREPARE stmt_name 的作用域是当前客户端连接会话可见。

E: 要释放一个预定义语句的资源,可以使用 DEALLOCATE PREPARE 句法。

F: EXECUTE stmt_name 句法中,如果 stmt_name 不存在,将会引发一个错误。

G: 如果在终止客户端连接会话时,没有显式地调用 DEALLOCATE PREPARE 句法释放资源,服务器端会自己动释放它。

H: 在预定义语句中,CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支持。

I: PREPARE 语句不可以用于存储过程,自定义函数!但从 MySQL 5.0.13 开始,它可以被用于存储过程,仍不支持在函数中使用!

下面给个示例:

Sql代码

CREATE PROCEDURE `p1`(IN id INT UNSIGNED,IN name VARCHAR(11))

BEGIN lable_exit:

BEGIN

SET @SqlCmd = 'SELECT * FROM tA ';

IF id IS NOT NULL THEN

SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE id=?');

PREPARE stmt FROM @SqlCmd;

SET @a = id;

EXECUTE stmt USING @a;

LEAVE lable_exit;

END IF;

IF name IS NOT NULL THEN

SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE name LIKE ?');

PREPARE stmt FROM @SqlCmd;

SET @a = CONCAT(name, '%');

EXECUTE stmt USING @a;

LEAVE lable_exit;

END IF;

END lable_exit;

END;

CALL `p1`(1,NULL);

CALL `p1`(NULL,'QQ');

DROP PROCEDURE `p1`;

了解了PREPARE的用法,再用变量做表名就很容易了。不过在实际操作过程中还发现其他一些问题,比如变量定义,declare变量和set @var=value变量的用法以及参数传入的变量。  测试后发现,set @var=value这样定义的变量直接写在字符串中就会被当作变量转换,declare的变量和参数传入的变量则必须用CONCAT来连接。具体的原理没有研究。  EXECUTE stmt USING @a;这样的语句USING后面的变量也只能用set @var=value这种,declare和参数传入的变量不行。

mysql prepare 存储过程_mysql prepare 存储过程使用相关推荐

  1. mysql exec函数_mysql exec 存储过程

    MySql存储过程 create proc 名称 参数列表 as 代码段 exec 存储过程名称 参数列表 要点: 1.可以使用output修饰参数 2.可以使用默认值,注意需要将最后的参数设置成默认 ...

  2. mysql过程异常处理_mysql数据库存储过程异常处理

    14.1.4  定义条件和处理程序 定义条件和处理程序是事先定义程序执行过程中可能遇到的问题.并且可以在处理程序中定义解决这些问题的办法.这种方式可以提前预测可能出现的问题, 并提出解决办法.这样可以 ...

  3. c mysql分页存储过程_mysql 分页存储过程调用报错

    以前没有写过存储过程,第一次写遇到了这个问题,没弄明白.希望哪位大神能给出的建议!!! sql 语句如下: CREATE DEFINER=`root`@`%` PROCEDURE `pager` ( ...

  4. mysql PREPARE用法_mysql prepare语句使用

    每次都看别人的,今天我自己写下来,以后就不用看别人的了 语法 PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [U ...

  5. mysql 高效分页存储过程_mysql分页存储过程

    CREATE PROCEDURE 'sp_page'( in _pagecurrent int,--/*当前页*/ in _pagesize int,--/*每页的记录数*/ in _ifelse v ...

  6. mysql 定义存储过程_mysql——定义——存储过程和函数——概念

    存储过程和函数是指将经常使用的一组SQL语句组合在一起,并将这些SQL语句当作一个整体存储在服务器中 一.创建存储过程 语法格式: create procedure sp_name ( [ proc_ ...

  7. mysql触发器和存储过程_MySql的存储过程和触发器

    Mysql的存储过程是类似于其它编程语言中的函数的功能,存储过程内部可以使用顺序循环和转移三种基本程序结构,而且整个存储过程可以接受和返回参数. 创建存储过程(procedure)时,因为其内部有以; ...

  8. mysql 导出函数_mysql导出存储过程或函数

    查询数据库中的存储过程和函数 方法一: select `name` from mysql.proc where db = 'your_db_name' and `type` = 'PROCEDURE' ...

  9. java mysql 触发器 存储过程_mysql 触发器 存储过程 java调用

    触发器和存储过程是为了提高SQL的运行效率. SQL语句先编译.后执行,而触发器与存储过程都会提前预编译完成,且只编译一次,供反复调用. 随着时代的进步,硬件与带宽的提升,触发器和存储过程提升效率并不 ...

最新文章

  1. 每个前端开发者必会的二十个JavaScript面试题
  2. 通俗讲解分布式锁,看完不懂算我输
  3. 设计模式(C++实现)--一句话总结
  4. MySQL笔记-死锁原理与分析及InnoDB中如何减少死锁
  5. 通用单向链表设计(一)——接口的设计
  6. sqlalchemy通过已经存在的表生成model的方法
  7. 第二轮冲次会议第三次
  8. java jar命令_Java命令行之jar命令
  9. rust怎么传送到队友_对阵时遇到中二病怎么办?还能怎么办,溜TA就对了!
  10. 账龄分析表excel模板_华为财务EXCEL内训手册(共131套模板,带公式).xls
  11. 怎么在中国知网免费下载论文?
  12. 将多张小图片合并成一张大图片 Python3
  13. 操作系统(四)---MS-DOS微软磁盘操作系统
  14. 青岛大学苏晓泉组-微生物组16S扩增子功能校正算法Meta-Apo
  15. SV-- event(二)
  16. 全球顶尖的程序化交易模型
  17. Lq93:复原 IP 地址
  18. 【转载】Python第三方库资源
  19. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Lexical Ambiguity、Fallback Detection
  20. WORD文档打开文件时老提示发送错误报告,或者打印不全

热门文章

  1. html 文本框点击无样式,HTML文本框样式大全
  2. 电脑能上网却打不开某个网站
  3. CSS中渐变色样式以及box-sizing属性
  4. Installing SharePoint 2010 on Windows 7
  5. D. The Enchanted Forest
  6. Icinga 通过 WMI 远程监控Windows
  7. Vue中video.js踩坑日记 单页切换后视频无法播放
  8. [IOS Dev] 关于Protocols, Delegate, 和Closures
  9. JAVA高级(上)简单总结
  10. 基于Vue2全家桶的移动端AppDEMO实现