SQL

SQL 知识量:22 - 44 - 129

19.2 使用存储过程><

执行存储过程- 19.2.1 -

执行存储过程非常简单,但是不同的DBMS执行命令是不同的。例如:执行不需参数的存储过程abc。

如果是Oracle数据库,使用execute语句:

execute abc;

如果是MySQL数据库,使用call语句:

call abc();

以上是一个简单的存储过程的执行,复杂一些的存储过程可能还需要输入参数或返回数据。

创建存储过程- 19.2.2 -

可以使用create procedure语句来创建存储过程,不同的DBMS在语法上存在差异,下面以MySQL为例,创建一个存储过程showPeople,功能是显示表people的内容。

delimiter //
create procedure showPeople()
begin
select * from people;
end//
delimiter ;

其中,delimiter //用于告诉命令行实用程序使用//作为新的语句结束分隔符。之所以要改变默认的语句结束分隔符,是因为命令行实用程序和存储过程自身都默认使用分号(;)作为语句结束分隔符,这会造成混乱,命令行实用程序遇到存储过程的分号后(即people后面的分号),就会开始执行SQL语句,命令就会出错。实际上,可以将默认的语句结束分隔符修改为除\符号以外的任何字符。以上语句的最后,使用delimiter ;将语句结束分隔符改回了默认的分号。

执行存储过程:

call showPeople();

结果为:

+----+----------+---------+--------+
| id | realName | realAge | sex    |
+----+----------+---------+--------+
|  1 | Susan    |      12 | female |
|  2 | Jame     |      12 | male   |
|  3 | Bob      |      12 | male   |
|  4 | Robot    |      12 | male   |
|  5 | Jen      |      12 | female |
|  6 | Toney    |      12 | male   |
|  8 | Alice    |      12 | female |
|  9 | Bonnie   |      12 | male   |
| 10 | Ella     |      12 | female |
| 11 | Bill     |      15 | male   |
| 12 | Limon    |      14 | male   |
| 13 | Soen     |      16 | male   |
+----+----------+---------+--------+

参数和返回值- 19.2.3 -

复杂的存储过程会使用参数和返回值,通过存储过程名后面的括号来规定。例如以MySQL为例,创建一个带参数和返回值的存储过程mul,功能是接收两个数值,返回它们的乘积。

delimiter //
create procedure mul(in num1 int,in num2 int,out result int)
begin
select num1*num2 into result;
end //
delimiter ;

以上SQL语句中,使用了关键字in和out。MySQL支持in、out和inout类型的参数。

  • in表示传递给存储过程。

  • out表示从存储过程传出。

  • inout表示对存储过程转入和传出。

在参数名后面必须给出数据类型,以上使用的是int类型。需要注意的是:结果集不是允许的类型,也就是说不能通过一个参数返回多个行或列。

通过select into语句将要返回的结果放入返回参数。

执行存储过程:

call mul(50,365,@r);
select @r;

结果:

+-------+
| @r    |
+-------+
| 18250 |
+-------+

执行存储过程后,返回的值存入了变量@r中,想要查看结果,需要使用select语句。注意:在MySQL中,所有变量以@开始。

删除存储过程- 19.2.4 -

要删除存储过程,可以使用drop procedure语句。例如:删除存储过程mul。

drop procedure mul;