码迷,mamicode.com
首页 > 数据库 > 详细

MySQL存储过程

时间:2016-04-10 01:03:14      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:

在MySQL中使用存储过程,可以将相关的数据操作语句打包在一起,减少了应用程序到数据库之间的连接,相应地提高了性能。当然如果要编写大量的存储过程,维护调试也是个问题。因此需要自己权衡利弊。

0、语法

DELIMITER $$
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE `test`.`my_procedure`()
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT ‘string‘*/
    BEGIN
      SQL statement
    END$$
DELIMITER ;

1、参数类型

 MySql存储过程的参数主要有3种类型:IN、OUT、INOUT。IN表示输入参数,OUT表示输出参数,INOUT既可以当做输入参数也可以当做输出参数。

2、变量定义以及作用范围

 变量定义(declare):

DECLARE sum_var INT(4) DEFAULT 0;

 

变量的作用范围在BEING ... END 之间,注意BEGIN ... END 还可以嵌套BEGIN ... END。变量赋值的方式有两种:使用关键字SET, set sum_var = 10; 另一种是 select xx into sum_var from tb_xx ; 

3、案例

创建一个简单的商品表

CREATE TABLE product(
    product_id INT(10) NOT NULL AUTO_INCREMENT,
    product_code VARCHAR(10),
    product_name VARCHAR(20),
    product_desc VARCHAR(100),
    PRIMARY KEY(product_id)
) CHARSET=utf8 ;

#插入数据
INSERT INTO product VALUES (0,‘Phone‘,‘手机‘,‘IPhone‘) ,(0,‘Apple‘,‘水果‘,‘苹果‘);

 

 只有IN参数的存储过程

DELIMITER $$
DROP PROCEDURE IF EXISTS getProductsByCode$$
CREATE
    PROCEDURE `test`.`getProductsByCode`(IN productCode VARCHAR(10))
    COMMENT get products by code
    BEGIN
      SELECT * FROM product WHERE product_code = productCode;
    END$$
DELIMITER ;

 

存储过程的调用方式为:call procedure_name(...);

mysql> call getProductsByCode(Phone);
+------------+--------------+--------------+--------------+
| product_id | product_code | product_name | product_desc |
+------------+--------------+--------------+--------------+
|          1 | Phone        | 手机         | IPhone       |
+------------+--------------+--------------+--------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

 

IN、OUT参数

DELIMITER $$
DROP PROCEDURE IF EXISTS procedure_add$$
CREATE
    PROCEDURE `test`.`procedure_add`(IN a INT(4) , IN b INT(4) , OUT c INT(4))
    BEGIN
      DECLARE sum_ INT(4) DEFAULT 0;
      SET sum_ = a + b;
      SET c = sum_;
    END$$
DELIMITER ;

 

mysql> call procedure_add(2,3,@sum);
Query OK, 0 rows affected (0.00 sec)

mysql> select @sum;
+------+
| @sum |
+------+
|    5 |
+------+
1 row in set (0.00 sec)

 

在客户端调用存储时,OUT参数需要使用@xx 来接收,delimiter $$ (可自定义) 定义的字符串是告诉MySQL只有遇到$$才会认为编写的SQL结束。因为MySQL默认的是分号(;),这就会导致语义不正确。

 

MySQL存储过程

标签:

原文地址:http://www.cnblogs.com/zhouxyx/p/5373058.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!