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

Mysql-存储过程

时间:2019-09-10 00:29:44      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:有一个   sid   begin   out   span   key   res   int   nts   

存储过程

什么是存储过程

存储过程是为以后的使用而保存的一条或条SQL语句的集合,类似于批处理

 

为什么用存储过程

1)简单,把多条SQL语句封装在类似函数的单元中,方便调用和修改

2)安全,通过存储过程限制基础数据的访问,减少数据讹误的机会;

  防止了错误,需要执行的步骤越多,就越可能出错,保持了数据的一致性。

3)高性能,存储过程比单独的SQL语句要快

 

怎么使用存储过程

首先创建一个表

CREATE TABLE students(
    stu_id INT(10) not NULL AUTO_INCREMENT PRIMARY KEY,
        stu_name VARCHAR(50) not NULL,
        age INT(3) not NULL
)ENGINE="INNODB", CHARSET="UTF8";
INSERT INTO students VALUES(NULL, "lily", 21);
INSERT INTO students VALUES(NULL, "tom", 18);
INSERT INTO students VALUES(NULL, "marton", 16);

 

创建存储过程

栗子1:创建无参数的存储过程

DELIMITER //

CREATE PROCEDURE studentage()
BEGIN
    SELECT AVG(age) AS studentavgage
    FROM students;
END //

DELIMITER ;

 调用

CALL studentage();

 

栗子2:创建有参数的存储过程

DELIMITER //

CREATE PROCEDURE studentage(
    OUT agel INT,
    OUT ageh INT,
    OUT agea INT
)
BEGIN
    SELECT MIN(age) 
    INTO agel
    FROM students;
    SELECT MAX(age)
    INTO ageh
    FROM students;
    SELECT AVG(age)
    INTO agea
    FROM students;
END //

DELIMITER ;

调用

CALL studentage(@agemin, @agemax, @ageavg);
SELECT @agemin, @agemax, @ageavg;

 

栗子3:创建一个有输入输出的存储过程

DELIMITER //

CREATE PROCEDURE studentage(
    IN agelimit INT,
    OUT scount INT
)
BEGIN
    SELECT COUNT(*) 
    INTO scount
    FROM students
    WHERE age > agelimit;
END //

DELIMITER ;

调用

CALL studentage(18, @scount);
SELECT @scount;

 

栗子4:创建智能存储过程

需求

三个同学一起上超市购物,超市现在有一个大一新生的优惠活动,旨在促进年轻的大一新生前来购物

是大一新生,购物总价打八折(当然这个需求是我胡诌的。。。-_-)

 

准备数据

CREATE TABLE orderitems(
ord_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
stu_id INT,
total_price DECIMAL(8, 2)
);


INSERT INTO orderitems VALUES(NULL, 1, 200.00);
INSERT INTO orderitems VALUES(NULL, 2, 300.00);
INSERT INTO orderitems VALUES(NULL, 3, 400.00);

SELECT * FROM orderitems;

 

创建

DELIMITER //

CREATE PROCEDURE ordertotal(
    IN sid INT,
    IN isfreshman BOOLEAN,
    OUT ototal DECIMAL(8, 2)
)COMMENT Obtain ordertotal after discount, optionally adding discount

BEGIN
    -- Declare variable for total
    DECLARE total DECIMAL(8, 2);
    -- Declare variable discount percentage
    DECLARE discountperc INT DEFAULT 8;

    -- Get the order total
    SELECT total_price
    FROM orderitems
    WHERE stu_id = sid
    INTO total;

    -- the student is freshman?
    IF isfreshman THEN
        SELECT total*discountperc/10 INTO total;
    END IF;

    -- Finally, save to out variables
    SELECT total INTO ototal;

END //
        
DELIMITER ;

 

调用

CALL ordertotal(1, 1, @ototal);
SELECT @ototal;

 

说明

1)OUT表示从存储过程中传出

2)IN表示传递给存储过程

3)INOUT表示对存储过程传入和传出

4)INTO指定一个检索的值保存到OUT对应的变量中

5)存储过程的代码位于BEGIN和END语句内

6)所有的MYSQL变量都以@为首

7)BOOLEAN值指定1为真,0为假

8)DECLARE定义两个局部变量,要求指定变量名和数据类型

 

显示存储创建过程语句

SHOW CREATE PROCEDURE studentage;

 

显示何时、由谁创建等信息

SHOW PROCEDURE STATUS LIKE studentage;

 

删除存储过程

DROP PROCEDURE studentage;

 

参考资料:《Mysql必知必会》

Mysql-存储过程

标签:有一个   sid   begin   out   span   key   res   int   nts   

原文地址:https://www.cnblogs.com/marton/p/11470471.html

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