存储过程与函数的区别
本质上没区别。函数只能通过return语句返回单个值或者表对象。而存储过程不允许执行return,但是通过out参数返回多个值。 函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。函数限制比较多,如不能用临时表,只能用表变量等,而存储过程的限制相对就比较少。
1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
2. 当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句.
3. 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
4. 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
5. 存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值,可以向程序返回错误原因。但函数只能返回一个特定类型的值或者表对象。
6. 存储过程中的CRUD的操作会影响数据库状态,但函数却不能。
7. 函数只能是in类型,存储过程可以使用In\out\inout类型。
前两个都只显示过程名称,第三个显示了用户,创建时间等更多信息。
和上面的前两个一样都是显示过程的名字。
delimiter//
create procedure destu (out sid int )
begin
select count(*) into sid from stu;
end//
delimiter;
call destu(@sid );
drop proceduredestu;
select@sid;
注意,调用存储过程destu时括号里的参数是@sid, 因为定义存储过程的时候 ,输出sid。然后查看也是select @sid。
while循环
delimiter //
create procedure w()
begin
declare i int default 10;
while i>=0 do 循环开始 判断条件成立则开始循环
insert into stu values(null,concat('www',i),28);
seti =i-1;
end while; 循环结束
end//
delimiter;
注意如果i=i+1放在while外面,会陷入死循环,
loop循环
delimiter //
create procedure instu()
begin
declare i int default 1;
aa:loop 循环开始
if i>10 then
leave aa; 判断条件成立则结束循环
end if;
seti=i+1;
insert into stu values (null,'aa', 12);
end loop aa; 循环结束
end//
delimiter; aa是loop的名字,这个可以随意取名。
Repeat 循环
delimiter //
create procedure sum6 ( a int)
begin declare sum int default 0;
declare i int default 1;
repeat -- 循环开始
set sum=sum+i;
set i=i+1;
until i>a end
repeat; --结束循环
select sum; --输出结果 如果是自定义函数,这里是return sum不是select
end//
delimiter;
call sum6 (100);
注意在结束循环后面加了输出结果后,执行存储过程就可以直接返回值
网友评论