存储过程
什么是存储过程
存储过程是为以后的使用而保存的一条或条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必知必会》
来源:https://www.cnblogs.com/marton/p/11470471.html