过程是存储在数据库中的常规脚本语言中的子例程(类似于子程序)。在 MySQL 的情况下,程序是用 MySQL 编写的并存储在 MySQL 数据库/服务器中。 MySQL 过程具有名称、参数列表和 SQL 语句。
有四种不同类型的 MySQL 过程:
1. 无参数过程:
没有参数的过程不接受任何输入或间接转换输出。它被简单地调用,其过程名称后跟 ()(不带任何参数)。它用于简单的查询。
例子:
考虑两个表作者和书:
create table author (author_id integer primary key,
authorName varchar(30),
email varchar (25), gender varchar (6));
create table book (BookId integer not null unique,
ISBN integer primary key,
book_name varchar (30) not null,
author integer, ed_num integer,
price integer, pages integer,
foreign key (author) references author (author_id) on delete cascade);
将值插入其中:
insert into author values
(1, "Kraig Muller", "Wordnewton@gmail.com", "Male");
insert into author values
(2, "Karrie Nicolette", "karrie23@gmail.com", "Female");
insert into book values
(1, 001, "Glimpses of the past", 1, 1, 650, 396);
insert into book values
(2, 002, "Beyond The Horizons of Venus", 1, 1, 650, 396);
insert into book values
(3, 003, "Ultrasonic Aquaculture", 2, 1, 799, 500);
insert into book values
(4, 004, "Cyrogenic Engines", 2, 1, 499, 330);
显示所有书籍的过程(不带参数):
delimiter //
create procedure display_book()
-> begin
-> select *from book;
-> end //
call display_book(); //
输出:
+--------+------+------------------------------+--------+--------+-------+-------+
| BookId | ISBN | book_name | author | ed_num | price | pages |
+--------+------+------------------------------+--------+--------+-------+-------+
| 1 | 1 | Glimpses of the past | 1 | 1 | 650 | 396 |
| 2 | 2 | Beyond The Horizons of Venus | 1 | 1 | 650 | 396 |
| 3 | 3 | Ultrasonic Aquaculture | 2 | 1 | 799 | 500 |
| 4 | 4 | Cyrogenic Engines | 2 | 1 | 499 | 330 |
+--------+------+------------------------------+--------+--------+-------+-------+
4 rows in set (0.0012 sec)
2. 带有 IN 参数的程序:
IN 参数用于将参数作为输入,例如属性。当我们在过程中定义 IN 参数时,调用程序必须将参数传递给存储过程。此外,IN 参数的值受到保护。这意味着即使过程内部更改了 IN 参数的值,在过程结束后仍保留其原始值(如按值传递)。换句话说,该过程仅适用于 IN 参数的副本。
例子:
以图书的 ISBN 及其新价格作为输入更新图书价格的程序:(考虑上表)
delimiter //
create procedure update_price (IN temp_ISBN varchar(10), IN new_price integer)
-> begin
-> update book set price=new_price where ISBN=temp_ISBN;
-> end; //
call update_price(001, 600); //
我们将 ISBN 为“001”(过去的一瞥)的图书价格更改为 600(从其默认价格 650)。
输出:
delimiter ;
select *from book;
+--------+------+------------------------------+--------+--------+-------+-------+
| BookId | ISBN | book_name | author | ed_num | price | pages |
+--------+------+------------------------------+--------+--------+-------+-------+
| 1 | 1 | Glimpses of the past | 1 | 1 | 600 | 396 |
| 2 | 2 | Beyond The Horizons of Venus | 1 | 1 | 650 | 396 |
| 3 | 3 | Ultrasonic Aquaculture | 2 | 1 | 799 | 500 |
| 4 | 4 | Cyrogenic Engines | 2 | 1 | 499 | 330 |
+--------+------+------------------------------+--------+--------+-------+-------+
4 rows in set (0.0013 sec)
3. 带OUT参数的程序:
OUT 参数用于像 select运算符一样将参数作为输出或显示传递,但是是隐式的(通过设置值)。可以在过程内部更改 OUT 参数的值,并将其新值传递回调用程序。过程在启动时无法访问 OUT 参数的初始值。
例子:
使用输出参数显示所有书籍中最高价格的过程:
delimiter //
create procedure disp_max(OUT highestprice integer)
-> begin
-> select max(price) into highestprice from book;
-> end; //
call disp_max(@M); //
select @M;
输出:
我们图书数据库中最高价格是 ISBN 003(超声波水产养殖)的图书,显示价格为 799。
+-----+
| @M |
+-----+
| 799 |
+-----+
1 row in set (0.0005 sec)
4. 带有 IN-OUT 参数的程序:
INOUT 参数是 IN 和 OUT 参数的组合。这意味着调用程序可以传递参数,存储过程可以修改 INOUT 参数并将新值传递回调用程序。
例子:
使用输入输出参数获取性别类型输入(此处为“男性”/“女性”)的程序,该参数反映属于该性别类别/类型的作者数量:
delimiter //
create procedure disp_gender(INOUT mfgender integer, IN emp_gender varchar(6))
-> begin
-> select COUNT(gender)
INTO mfgender FROM author where gender = emp_gender;
-> end; //
delimiter ;
call disp_gender(@M, "Male");
select @M;
call disp_gender(@F, "Female");
select @F;
输出:
我们有两位作者,根据表格作者中的插入内容,一位是男性,一位是女性。因此,一位男性作者的输出分别为 1,一位女性作者的输出分别为 1。
+----+
| @M |
+----+
| 1 |
+----+
1 row in set (0.0004 sec)
+----+
| @F |
+----+
| 1 |
+----+
1 row in set (0.0005 sec)