存储过程和函数的区别
存储过程和函数,都是一组预先编译好的sql语句的集合
都具有下列的优点:
1)提高代码的重用性
2)简化操作
3)减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
区别:
存储过程:可以有0个返回值,也可以有多个返回值,适合做批量插入、批量更新等操作
函数:有且仅有1个返回值,适合做处理数据后,返回的一个结果
存储过程
参数模型的代表含义
in 代表输入值
out 代表输出值
inout 既可代表输入值,也可代表输出值
DELIMITER // ---------声明 // 为语句结束符
DROP PROCEDURE IF EXISTS test1// ------------如果test1存在,则删除
CREATE PROCEDURE test1(INOUT a INT,INOUT b INT) -----创建存储过程
BEGIN ------相当于java中的 " { "
SET a=a*2; -----此处的 “ ; ”只代表一个分隔符,不是语句结束符
SET b=b*2;
END // ------相当于java中的 " }"
DELIMITER ; ---------声明 ;为语句结束符
SET @m=10; ----------声明 用户变量 在变量名称前面加 “ @ ”
SET @n=20;,
CALL test1(@m,@n); -----调用存储过程
SELECT @m,@n; -----查询用户变量的值
函数
DELIMITER //
#-----创建函数test,参数为username,参数类型为 varchar,返回类型为 int
CREATE FUNCTION test(username VARCHAR(20)) RETURNS INT ----------此处是 return**s**
BEGIN
DECLARE result INT; #-----声明一个局部变量用于返回使用
SELECT a.id INTO result #-----将查询到的结果写进局部变量
FROM admin a
WHERE a.username=username;
RETURN result; ----------此处是 return
END //
DELIMITER ;
SELECT test('张三'); #-----调用函数
若 return 的结果超过1条,就会报错 Result consisted of more than one row
3种循环结构:
1)while 先判断后执行
Label:while loop_condition
do
loop_list;
end while Label;
例如:
DELIMITER //
CREATE PROCEDURE testWhile(IN total INT)
BEGIN
DECLARE i INT DEFAULT 0; #-----声明局部变量 i
a:WHILE i<= total DO
SET i=i+1; #-----修改局部变量的值
IF MOD(i,2) !=0 THEN ITERATE a; #-----如果 i 取模 2 的结果不等于 0 ,则进入下一个循环
END IF;
INSERT INTO admin(username,`password`) VALUES(CONCAT('小明',i),'666');
END WHILE a;
END//
DELIMITER ;
CALL testWhile(100);
SELECT * FROM admin;
2)repeat 先执行后判断
Label:repeat
loop_list
until end_condition;
end repeat Label;
3)loop 没有条件的死循环,需要搭配 leave Label 跳出循环
Label:loop
loop_list
end loop Label;