存储过程

存储过程

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。

语法
CREATE PROCEDURE 存储过程名 (参数列表)
BEGIN
– 代码 —SQL语句集
END

参数

存储过程根据需要可能会有输入、输出、输入输出参数,多个参数用","分割开。共有三种参数类型,IN,OUT,INOUT:

IN参数的值必须在调用存储过程时指定,在存储过程中可以修改该参数的值,但不能被返回

OUT该值可在存储过程内部被改变,并返回

INOUT调用时指定,并且可被改变和返回

调用

调用存储过程: CALL 存储过程名(参数列表);

删除

删除存储过程: DROP PROCEDURE 存储过程名;

实例1

输入参数有多个

定义

DROP PROCEDURE IF EXISTS p1;# 如果存储过程p1存在则删除
# 创建存储过程
CREATE PROCEDURE p1(IN a INT, IN b VARCHAR(20))
BEGIN
	select a;
	select b;
	set a=20;
	set b='hello world';
	select a;
	select b;
END;

调用1

call p1(10,'abcd')

调用2

set @x=12;
set @y='abc';
call p1(@x,@y);

select @x;
select @y;

@@:表示系统变量
@:表示自定义变量

实例2

带有传出参数

DROP PROCEDURE IF EXISTS p2;

CREATE PROCEDURE p2(out a INT, out b VARCHAR(20))
BEGIN
	select a;   # 会输出null,参数值传不进来
	select b;   # 会输出null,参数值传不进来
	set a=20;
	set b='hello world';
	select a;
	select b;
END;
set @m=12;
set @n='abc';
call p2(@m,@n);
select @m;   # 显示存储过程中设置的值  20
select @n;   # 显示存储过程中设置的值  hello world

实例3

输入输出参数

DROP PROCEDURE IF EXISTS p3;

CREATE PROCEDURE p3(INOUT a INT, INOUT b VARCHAR(20))
BEGIN
	select a;
	select b;
	set a=20;
	set b='hello world';
	select a;
	select b;
END;

调用

set @m=12;
set @n='abc';
CALL p3(@m,@n);

实例4

变量声明

DROP PROCEDURE IF EXISTS p4;

CREATE PROCEDURE p4(INOUT str VARCHAR(50))
BEGIN
  # DECLARE 变量名[,...] 变量类型 [DEFAULT 默认值]
  # 局部变量声明必须在最上面,并且中间还不能有任何其他代码
	DECLARE a VARCHAR(32);
	DECLARE b VARCHAR(32);
	DECLARE c VARCHAR(32) DEFAULT 'hello';

  select sno,sname into a,b from student where sno='200215121';

	set str=CONCAT(a,b,c);

END;

调用

set @s='';
CALL p4(@s);
select @s;

数据库编程-》

大数据-》

复杂的业务涉及到复杂的数据处理-》可以写成存储过程-》之后可以通过代码直接调用

-》存储过程执行需要占用服务器资源

实例5

IF-THEN–ELSEIF-THEN…–ELSE-END IF

DROP PROCEDURE IF EXISTS p5;

CREATE PROCEDURE p5(IN stu VARCHAR(10), IN cou INT)
BEGIN
    DECLARE DEG  INT;
    SELECT GRADE INTO DEG FROM sc WHERE SNO=stu and cno=cou;
    
    IF DEG>90
					THEN SELECT '优秀';
			ELSEIF DEG>85
					THEN SELECT '良好';
			ELSEIF  DEG>60
					THEN SELECT '及格';
			ELSE   select '不及格';
    END IF;
END;

调用

CALL p5('200215121',1)

实例6

[循环名:] LOOP
要循环的代码
END LOOP [循环名]

LEAVE 循环名:这个语句被用来退出任何被标注的流程控制构造 (跳出某个循环)
ITERATE 循环名:跳出某个循环,进入下一次循环

创建表,通过存储过程向表中插入100条数据

create table t1(
id int PRIMARY key auto_increment
)

存储过程

create PROCEDURE p6()
BEGIN
DECLARE i  INT DEFAULT 1;

	sta:LOOP
			 IF i>100
				 THEN LEAVE sta;
			 END IF;
			 
			 INSERT into t1 VALUES(null);
			 SET i = i + 1;
	END LOOP sta;

end;

调用

call p6();
# 清空表中的数据:删除表,重建表,可知id自增长序列,重新开始
TRUNCATE TABLE t1;
# 清空表中的数据:将数据删除,可知id自增长序列,一直在增加
delete from t1;

TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE无事务且不触发 trigger,有可能造成事故,故不建议在开发代码中使用此语句。 说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。

存储过程的游标cursor,遍历表中的每一行数据

cursor->指向查询结果-》之后可以依靠游标的移动,实现查询结果每一条记录的遍历操作

select * from student;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值