美文网首页技术
mysql存储过程

mysql存储过程

作者: liangxifeng833 | 来源:发表于2015-11-25 14:30 被阅读3952次

一,语法:

create procedure 存储过程名字()   
(   
[in|out|inout] 参数 datatype   
)   
begin   
MySQL 语句;   
end;

MySQL 存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”。习惯上,对于是“in” 的参数,我们都不会显式指定。

二,规则

  • 输入参数例子,我们选择了会话变量@x证明成功的将参数传入了改变量.
mysql> CREATE PROCEDURE p2(p INT) SET @x = p ;//  
Query OK, 0 rows affected (0.02 sec)  
   
mysql> CALL p2(123)//  
Query OK, 0 rows affected (0.00 sec)  
   
mysql> SELECT @x//  
+------+  
| @x   |  
+------+  
|  123 |  
+------+  
1 row in set (0.01 sec)  
  • 输出参数的例子,我们选择会话变量@y去接收存储过程p3
mysql> CREATE PROCEDURE p3(OUT p INT)  
    -> SET p = -5;//  
Query OK, 0 rows affected (0.00 sec)  
   
mysql> CALL p3(@y)//  
Query OK, 0 rows affected (0.01 sec)  
   
mysql> SELECT @y//  
+------+  
| @y   |  
+------+  
|   -5 |  
+------+  
1 row in set (0.00 sec)  
  • MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”

  • MySQL 存储过程参数,不能在参数名称前加“@”,如:“@a int”。下面的创建存储过程语法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要在变量名字前加“@”,虽然 MySQL 客户端用户变量要加个“@”。

  • MySQL 存储过程的参数不能指定默认值。

  • 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。

  • MySQL 存储过程中的每条语句的末尾,都要加上分号 “;”

  • MySQL 存储过程中的注释:

/*   
这是个   
多行 MySQL 注释。   
*/ 
declare c int; -- 这是单行 MySQL 注释 (注意 -- 后至少要有一个空格)   
if a is null then # 这也是个单行 MySQL 注释   
set a = 0;   
end if;   
...   
end; 
  • 不能在 MySQL 存储过程中使用 “return” 关键字:
set c = a + b;   
select c as sum;   
/*   
return c; -- 不能在 MySQL 存储过程中使用。return 只能出现在函数中。   
*/   
end;  
  • 调用 MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()”
call pr_no_param();  

三,实例:

  • 批量添加数据(预制原始券)
/*
* 预制原始券
-- @author: liangxifeng
-- @date  : 2015-11-25
-- @param : int - @ticketCount  - 要预制的券数量
-- @return: 成功返回:成功预制数量, 失败:返回具体信息
-- @php调用: mysql_fetch_assoc(mysql_query("CALL initTicket(100)"));
*/
DELIMITER $$
DROP PROCEDURE IF EXISTS `initTicket` $$
CREATE PROCEDURE initTicket( IN ticketCount INT ) 
    BEGIN 
    DECLARE i INT DEFAULT 0;                -- 计数器
    DECLARE returnMsg VARCHAR(50) DEFAULT '';   -- 返回值信息
    DECLARE rowCount int DEFAULT 0;             -- 操作sql的时候影响行数
    IF ticketCount >= 10000 || ticketCount=0 THEN
      SET returnMsg = 'paramError';
          SELECT returnMsg;
    ELSE
      outer_label:BEGIN
      START TRANSACTION;
      WHILE i < ticketCount DO
        SET i=i+1;
        INSERT INTO `ticket_main`   (`ticket_status`,`ticket_add_time`) VALUES (0,now());
        SELECT row_count() INTO rowCount;
        IF rowCount<=0 THEN
            LEAVE outer_label;          
        END IF;                 
      END WHILE;
    
      END outer_label;  -- 只要是在outer_label代码块内 任意位置 Leave outer_label,那么Leave后的代码将不再执行 

      IF i=ticketCount THEN
        COMMIT;
        SET returnMsg = i;
          ELSE
        ROLLBACK;
        SET returnMsg = 'error';
      END IF;
      SELECT returnMsg;
    END IF;
END $$
DELIMITER ;

代码实例

相关文章

  • 15 MySQL 存储过程

    MySQL 存储过程 [toc] 存储过程概述 存储过程介绍 存储过程,相当于是 MySQL 语句组成的脚本 指的...

  • 存储过程

    使用存储过程 1.存储过程 ​ 需要MySQL5---->> MySQL5添加了对存储过程的支持。 ​ 迄...

  • MySQL存储过程详解 mysql 存储过程

    原文链接 MySQL存储过程详解 1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然...

  • Mysql存储过程

    阅读目录:MySQL存储过程_创建-调用-参数 存储过程:SQL中的“脚本” 创建存储过程 调用存储过程 存储过程...

  • 面试官突然问我MySQL存储过程,我竟然连基础都不会!(详细)

    MySQL存储过程 一、存储过程 1.1 什么是存储过程 存储过程(Stored Procedure)是在大型数据...

  • MySQL存储过程创建及调用方法

    MySQL存储过程是一个sql语句,那么我们如何创建呢,MySQL存储过程创建及修改,删除操作。 1,存储过程创建...

  • 存储过程

    创建存储过程 mysql: 执行存储过程 mysql: 使用OUT参数和INOUT参数: PREPARE和EXEC...

  • SQL基本语句(以MySQL为例)-- 第五部分

    19、使用存储过程MySQL的存储过程的语句跟这本书上的差太远了吧,以下参考自:MySQL存储过程教程 20、管理...

  • MySQL存储过程和存储函数

    一、存储过程 MySQL存储过程存储过程和存储函数参考文章 SQL语句需要先编译然后执行,而存储过程(Stored...

  • MySQL存储过程

    1、关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这...

网友评论

    本文标题:mysql存储过程

    本文链接:https://www.haomeiwen.com/subject/vvarhttx.html