mysql学习之旅(十一)——存储过程

存储过程

什么是存储过程

存储过程是SQL语句和流程控制语句的预编译集合,并以一个名称存储并作为一个单元进行处理。
存储过程存放在数据库中,可以完成比较复杂的控制和计算,只有第一次需进行语法分析和编译,效率高。

存储过程的语法结构
CREATE PROCEDURE proc_name([proc_parameter])
[characteristics…] routine_body
proc_parameter指定存储过程的参数列表,形式如下:
[IN|OUT|INOUT] param_name type

过程体
过程体是由合法的SQL语句构成;
过程体可以是任意SQL语句;
过程体如果为复合结构则使用BEGIN…END语句;
复合结构可以包含声明,流程控制语句;

存储过程举例
创建一个查询图书的编号、书名、价格和库存的存储过程。
DELIMITER //
CREATE PROCEDURE selectproc1()
BEGIN
SELECT book_id,book_name,price,store FROM bookinfo;
END//
DELIMITER;
在这里插入图片描述

创建和使用存储过程

存储过程的语法结构
CREATE PROCEDURE proc_name([proc_parameter])
[characteristics…] routine_body
proc_parameter指定存储过程的参数列表,形式如下:
[IN|OUT|INOUT] param_name type

参数:
IN:表示该参数的值必须在调用存储过程时指定
OUT:表示该参数的值可以被存储过程改变,并且可以返回
INOUT:表示该参数必须在调用存储过程时指定,并且被存储过程改变,并且可以返回

调用存储过程
CALL proc_name([parameter[,…]]):
CALL proc_name([]);

创建无参的存储过程

例子:
创建查询图书编号、书名、图书类别的存储过程
DELIMITER //
CREATE PROCEDURE proc1()
BEGIN
SELECT book_id,book_name,category FROM bookinfo t1
JOIN bookcategory t2
ON t1.book_category_id =t2.category_id;
END//
DELIMITER;

CALL proc1();

创建带有输入参数和输出参数的存储过程

举例:
设计一个存储过程,删除一个读者,并输出剩余读者的个数。
DELIMITER //
CREATE PROCEDURE proc2(IN cid CHAR(18),OUT num INT)
BEGIN
DELETE FROM readerinfo WHERE card_id=cid;
SELECT COUNT(card_id) INTO num FROM readerinfo;
END//
DELIMITER;

CALL proc2(‘201122344432211234’,@num);
SELECT @num;
在这里插入图片描述举例:
设计一个存储过程,实现交换两个数的处理。
DELIMITER //
CREATE PROCEDURE proc3(INOUT num1 INT,INOUT num2 INT)
BEGIN
DECLARE t INT DEFAULT 0;
SET t=num1;
SET num1=num2;
SET num2=t;
END//
DELIMITER;
SET @n1=1,@n2=5;
CALL proc3(@n1,@n2);
SELECT @n1,@n2;
在这里插入图片描述###删除存储过程
语法结构:
DROP PROCEDURE [IF EXISTS] proc_name;
eg:
DROP PROCEDURE proc1;
DROP PROCEDURE IF EXISTS proc2;

创建复合结构的存储过程

使用条件判断语句的存储过程

举例:
设计比较两个数大小的存储过程。
DELIMITER //
CREATE PROCEDURE proc4(IN num1 INT,IN num2 INT,OUT result VARCHAR(30))
BEGIN
IF num1=num2 THEN
SET result=‘num1等于num2’;
ELSEIF num1>num2 THEN
SET result=‘num1大于num2’;
ELSE
SET result=‘num1小于num2’;
END IF;
END//
DELIMITER;

CALL proc4(5,5,@result);
SELECT @result;
在这里插入图片描述或者采用case语句:
DELIMITER //
CREATE PROCEDURE proc5(IN num1 INT,IN num2 INT,OUT result VARCHAR(30))
BEGIN
CASE
WHEN num1=num2 THEN SET result=‘num1等于num2’;
WHEN num1>num2 THEN SET result=‘num1大于num2’;
ELSE SET result=‘num1小于num2’;
END CASE;
END//
DELIMITER;

CALL proc5(5,5,@result);
SELECT @result;

使用循环控制语句的存储过程

举例:
设计一个存储过程,向数据表插入100条数据的存储过程。
DELIMITER //
CREATE PROCEDURE proc6()
BEGIN
DECLARE n INT DEFAULT 10;
WHILE n<=110 DO
INSERT INTO bookcategory VALUES (n,CONCAT(‘图书类别’,n),FLOOR(RAND()*5));
SET n=n+1;
END WHILE;
END //
DELIMITER;

CALL proc6();
SELECT* FROM bookcategory;
在这里插入图片描述

存储过程与函数的区别

一、功能上的不同:
存储过程:一般来说,存储过程实现的功能要复杂一些。功能强大,可以执行包括修改表等一系列数据库操作。
存储函数:实现的功能针对性比较强。

二、返回值上的不同:
存储过程:可以返回多个值,也可以不返回值,只是实现某种效果或动作。
存储函数:必须有返回值,而且只能有一个返回值。

三、参数的不同:
存储过程:存储过程的参数类型有三种,IN、OUT、INOUT。
存储函数:参数类型只有一种,类似于IN参数。调用函数时需要按照参数的类型指定值即可。

四、语法结构上的不同:
存储过程:存储过程声明时不需要指定返回类型。
存储函数:函数声明时需要指定返回类型,且在函数体中必须包含一个有效的RETURN语句。

五、调用方式上的不同:
存储过程:一般是作为一个独立的部分来执行,用CALL语句进行调用。
存储函数:嵌入在SQL语句中使用的,可以在select中调用。

发布了19 篇原创文章 · 获赞 2 · 访问量 1234

猜你喜欢

转载自blog.csdn.net/weixin_38377637/article/details/100178358