SQL 知识量:22 - 44 - 129
执行存储过程非常简单,但是不同的DBMS执行命令是不同的。例如:执行不需参数的存储过程abc。
如果是Oracle数据库,使用execute语句:
execute abc;
如果是MySQL数据库,使用call语句:
call abc();
以上是一个简单的存储过程的执行,复杂一些的存储过程可能还需要输入参数或返回数据。
可以使用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 | +----+----------+---------+--------+
复杂的存储过程会使用参数和返回值,通过存储过程名后面的括号来规定。例如以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中,所有变量以@开始。
要删除存储过程,可以使用drop procedure语句。例如:删除存储过程mul。
drop procedure mul;
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6