📜  MySQL中不同类型的过程

📅  最后修改于: 2021-09-09 11:15:44             🧑  作者: Mango

过程是存储在数据库中的常规脚本语言中的子例程(类似于子程序)。在 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)