`

mysql prepare 存储过程使用

 
阅读更多

语法

[sql]
  1. PREPARE statement_name FROM sql_text /*定义*/   
  2. EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/   
  3. DEALLOCATE PREPARE statement_name /*删除定义*/   


[sql]
  1. mysql> PREPARE prod FROM "INSERT INTO examlple VALUES(?,?)";   
  2. mysql> SET @p='1';   
  3. mysql> SET @q='2';   
  4. mysql> EXECUTE prod USING @p,@q;   
  5. mysql> SET @name='3';   
  6. mysql> EXECUTE prod USING @p,@name;   
  7. 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]
  1. mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';   
  2. mysql> SET @a = 3;   
  3. mysql> SET @b = 4;   
  4. mysql> EXECUTE stmt1 USING @a, @b;   
  5. +------------+   
  6. | hypotenuse |   
  7. +------------+   
  8. | 5 |   
  9. +------------+   
  10. mysql> DEALLOCATE PREPARE stmt1;   
  11. mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';   
  12. mysql> PREPARE stmt2 FROM @s;   
  13. mysql> SET @a = 6;   
  14. mysql> SET @b = 8;   
  15. mysql> EXECUTE stmt2 USING @a, @b;   
  16. +------------+   
  17. | hypotenuse |   
  18. +------------+   
  19. | 10 |   
  20. +------------+   
  21. mysql> DEALLOCATE PREPARE stmt2;  

 

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

 

[sql]
  1. mysql> SET @a=1;  
  2. mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";   
  3. mysql> EXECUTE STMT USING @a;   
  4. mysql> SET @skip=1; SET @numrows=5;   
  5. mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";   
  6. 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代码  收藏代码
  1. CREATE PROCEDURE `p1`(IN id INT UNSIGNED,IN name VARCHAR(11))  
  2. BEGIN lable_exit:  
  3. BEGIN  
  4. SET @SqlCmd = 'SELECT * FROM tA ';  
  5. IF id IS NOT NULL THEN  
  6. SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE id=?');  
  7. PREPARE stmt FROM @SqlCmd;  
  8. SET @a = id;  
  9. EXECUTE stmt USING @a;  
  10. LEAVE lable_exit;  
  11. END IF;  
  12. IF name IS NOT NULL THEN  
  13. SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE name LIKE ?');  
  14. PREPARE stmt FROM @SqlCmd;  
  15. SET @a = CONCAT(name'%');  
  16. EXECUTE stmt USING @a;  
  17. LEAVE lable_exit;  
  18. END IF;  
  19. END lable_exit;  
  20. END;  
  21. CALL `p1`(1,NULL);  
  22. CALL `p1`(NULL,'QQ');  
  23. DROP PROCEDURE `p1`;   

 

了解了PREPARE的用法,再用变量做表名就很容易了。不过在实际操作过程中还发现其他一些问题,比如变量定义,declare变量和set @var=value变量的用法以及参数传入的变量。

测试后发现,set @var=value这样定义的变量直接写在字符串中就会被当作变量转换,declare的变量和参数传入的变量则必须用CONCAT来连接。具体的原理没有研究。

EXECUTE stmt USING @a;这样的语句USING后面的变量也只能用set @var=value这种,declare和参数传入的变量不行。

分享到:
评论

相关推荐

    MYSQL分页存储过程

    通过上述示例,我们可以看到,使用MySQL存储过程实现分页查询不仅能够提高查询效率,还能简化应用程序逻辑,增强系统的可维护性和可扩展性。然而,设计存储过程时也需要注意安全性,避免SQL注入等风险,确保数据库...

    mysql存储过程实现分页

    MySQL作为一种广泛使用的数据库管理系统,支持通过存储过程的方式来实现分页功能。 #### 存储过程简介 MySQL中的存储过程是一种用户定义的过程,在其中可以封装一系列SQL语句或控制流语句,以便在需要时调用。存储...

    mysql分页存储过程

    ### MySQL 分页存储过程详解 在数据库操作中,分页是一项非常常见的需求,尤其是在处理大量数据时。通过分页可以有效地提高数据展示的效率,并优化用户体验。本文将深入解析一个MySQL中的分页存储过程,旨在帮助...

    MySQL存储过程.pdf

    11. **动态SQL**:存储过程内可以使用PREPARE和EXECUTE语句来构建和执行动态SQL,这在处理不确定结构的数据时非常灵活。 12. **返回值**:虽然MySQL的存储过程不能直接返回一个值,但可以通过OUT参数或者临时表来...

    mysql存储过程之返回多个值的方法示例

    MySQL存储过程是数据库中用于执行复杂操作的一组预编译的SQL语句,它们可以接收输入参数、输出结果以及在内部处理数据。在本示例中,我们将探讨如何通过存储过程返回多个值,并且结合PHP进行调用。 首先,我们要...

    精通MySQL存储过程和函数

    以上内容概述了MySQL存储过程和函数的基本概念、创建方法、变量定义、条件处理、流程控制、游标使用、预处理语句以及常见问题。通过这些知识点的学习,可以帮助开发者更好地理解和应用MySQL存储过程和函数,从而提高...

    c API 调用mysql存储过程完成增删改查

    在C API中调用这个存储过程,我们需要使用`mysql_query()`函数执行SQL命令,将参数通过`mysql_stmt_prepare()`、`mysql_stmt_bind_param()`设置,然后执行`mysql_stmt_execute()`。这里以调用上述存储过程为例: ``...

    mysql存储过程简单应用编写

    在MySQL存储过程中,我们可以使用循环来执行重复的任务。两种常见的循环结构是WHILE循环和FOR循环。WHILE循环基于一个条件来决定是否继续执行,而FOR循环通常用于已知循环次数的情况,如遍历一个范围内的数字。 ...

    MySQL存储过程实例教程

    MySQL存储过程是一种预编译的SQL语句集合,它允许开发者封装一系列的操作在一个单一的命名实体中,提高了数据库操作的效率和安全性。...通过学习和熟练掌握存储过程的创建和使用,开发者能够更高效地管理MySQL数据库。

    使用MYSQL5创建存储过程procedure

    在本主题中,我们将深入探讨如何使用MySQL5创建存储过程,并结合PL/SQL语言来实现分表功能。 首先,让我们了解存储过程的基本语法。在MySQL中,创建存储过程通常包含以下部分: 1. `CREATE PROCEDURE` 关键字,...

    mysql存储过程动态创建多列

    在MySQL中,存储过程是一种预编译的SQL代码集合,它可以接受输入参数,执行一系列复杂的数据库操作,并返回结果。本文将深入探讨如何利用MySQL存储过程动态创建多列,这是一个高级功能,尤其适用于需要根据运行时...

    用C调用mysql数据库的存储过程

    使用`mysql_stmt_prepare()`函数,将SQL命令字符串传递给MySQL服务器预编译。预处理语句能提高性能并防止SQL注入。 3. 绑定参数。调用`mysql_stmt_bind_param()`来绑定参数到预处理语句中的占位符。这需要定义一个...

    MySQL 存储过程中执行动态SQL语句的方法

    在MySQL数据库中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作。在某些场景下,我们可能需要在存储过程中执行动态构建的SQL语句,以适应不断变化的需求。以下将详细解释如何在MySQL存储过程中...

    mysql存储过程 在动态SQL内获取返回值的方法详解

    MySQL存储过程是数据库中用于执行一组特定操作的预编译的SQL语句集合。它们允许开发人员封装复杂的逻辑,提高代码复用性和数据库操作效率。在动态SQL中获取返回值是存储过程的一个重要功能,尤其在处理不确定的数据...

    深入mysql存储过程中表名使用参数传入的详解

    本文将深入讲解如何在MySQL存储过程中使用参数传入表名,并通过示例来说明其具体实现。 首先,我们来看存储过程的基本结构。存储过程由`BEGIN`和`END`关键词包围,中间包含了各种SQL语句。在本例中,存储过程的目的...

    MySQL存储过程:数据库编程的高级艺术

    #### MySQL 存储过程的创建与使用 ##### 创建存储过程 在MySQL中,可以通过`CREATE PROCEDURE`语句创建存储过程。例如,下面的示例展示了一个简单的存储过程`GetProductCount`,它接受一个`productCategory`参数,...

    MySQL中预处理语句prepare、execute与deallocate的使用教程

    MySQL官方将prepare、execute、deallocate统称为PREPARE STATEMENT,我习惯称其为【预处理语句】,其用法十分简单,下面话不多说,来一起看看详细的介绍吧。 示例代码 PREPARE stmt_name FROM preparable_stmt ...

    PHP调用MySQL的存储过程的实现代码

    以下是使用MySQLi扩展调用存储过程的方法,这是一个更推荐的方式,因为它不仅支持无返回结果的存储过程,还支持处理带有返回结果的存储过程。以下是一个示例: ```php // 假设已建立数据库连接$conn // 调用存储...

    mysql创建存储过程实现往数据表中新增字段的方法分析

    在MySQL中,存储过程是一种预编译的SQL代码集合,它可以封装复杂的逻辑并多次重复使用。本篇文章将详细解析如何创建存储过程以实现在数据表中动态新增字段的功能。 首先,我们来理解基本的存储过程创建语法。在...

Global site tag (gtag.js) - Google Analytics