Mysql编程-存储过程

2023-02-24 08:47:38

一: 简单的存储过程

在这里插入图片描述

二:变量

1.变量的明使用declare,一句declare只声明一个变量,变量必须先声明后使用
2.变量具有数据类型和长度,与mysql的SQL数据类型保持一致,因此甚至还能指定默认值、字符集和排序规则等
3.变量可以通过set来赋值,也可以通过select into的方式赋值
4.变量需要返回,可以使用select语句,如:select变量名
5.变量是有作用域的,作用范围在begin与end块之间,end结束变量的作用范围即结束。
6.需要多个块之间传递值,可以使用全局变量,即放在所有代码块之前。

分类

见:链接

定义条件和处理

条件的定义

declare condition_name CONDTION FOR condtion_value

例子

#方法一:使用sqlstate_value 
DECLARE can_not_find  CONDITION FOR sqlstate '42S02'; 
#方法二:使用mysql_error_code 
DECLARE can_not_find  CONDITION FOR 1146;

条件的处理

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

在这里插入图片描述
例子

DECLARE CONTINUE HANDLER FOR SQLSTATE *23000' SET @x2 = 1

传入参数(IN)

CREATE PROCEDURE testa(IN `my_uid` int)
BEGIN
  #声明一个存储过程变量
	DECLARE my_uname VARCHAR(32) DEFAULT '';
	#把变量的值设置为hxf
	SET my_uname='hxf';
	#将users表中id为myuid的那一条的uname的值赋给该变量my_uname
	SELECT uname INTO my_uname FROM users WHERE uid=my_uid;
	#返回一个变量my_uname
	select my_uname;
END;

在这里插入图片描述
1.传参变量是全局的,可以在多个之间起作用。
2.传入参数:类型为IN,表示该参数的值必须在调用存储过程时指定,如果不显式指定为IN,那么默认就是IN类型。
3.IN类型参数一般只用于传入,在调用存储过程中一般不作修改和返回。

传出参数(OUT)

CREATE PROCEDURE testa(IN `my_uid` int,OUT `my_uname` varchar(32))
BEGIN
	SELECT uname INTO my_uname FROM users WHERE uid=my_uid;
END;

在这里插入图片描述
1.如果调用存储过程中需要修改和返回值,可以使用OUT类型参数。
2.传出参数:在调用存储过程中,可以改变其值,并可返回
3.OUT是传出参数,不能用于传入参数值
4.调用存储过程时,OUT参数也需要指定,但必须变量,不能是常量

传入传出参数(INOUT)

CREATE PROCEDURE testa(INOUT `my_uid` int)
BEGIN
   SELECT uid INTO my_uidFROM users WHERE uid=1;
END;

在这里插入图片描述
1.如果既需要传入,同时又需要传出,则可以使用INOUT类型参数
2.调用时可传入值,在调用过程中,可修改其值,同时也可返回值。
3.INOUT参数集合了IN和OUT类型的参数功能
4.INOUT调用时传入的是变量,而不是常量

三:条件语句

BEGIN
	#Routine body goes here...
DECLARE my_uname VARCHAR(32) DEFAULT '';
if(my_uid%2=0)
THEN
SELECT uname INTO my_uname FROM users WHERE uid=my_uid;
SELECT my_uname;
ELSE
	SELECT my_uid;
end if;
END

在这里插入图片描述
在这里插入图片描述
1.条件语句最基本的结构

if(condtion)
then
//add some code
else
//add some code
end if

2.if表达式可以是任意判断返回真或者假的表达式
3.多条件判断结构

if(condtion)
then
//add some code
else if(condtion)
then
//add some code
else
//add some code
end if

四:循环语句

while

BEGIN
	#Routine body goes here...
	DECLARE i int DEFAULT 0;
	WHILE(condtion) DO
	BEGIN
		//add some code
	END;
	END WHILE;
END

repeat

BEGIN
	#Routine body goes here...
	DECLARE i int DEFAULT 0;
	repeat
	BEGIN
		//add some code
	END;
	until condtion
	end repeat
END

五:游标

在这里插入图片描述

六:删除存储过程

drop procedure [if exists] sp_name

七:查看存储过程

//查看存储过程的状态
show procedure status like 'name'\G
//查看存储过程的定义
show create procedure name \G
//通过information_schema.Routines就可以获得存储过程的名称的信息
select * from routines where ROURINE_NAME='name' \G

八:存储过程的特点

  • 能完成较复杂的判断和运算
  • 可编程性强,很活
  • SQL编程的代码可重复使用
  • 执行效率相对快一点
  • 减少网络之间的传输,节省开销
  • 不可移植性,每种数据库的存储过程不尽相同
  • 学习成本高,如果一个团队中懂存储过程的人多,那么还好一点
  • 存储过程可能会封装很多业务细节,导致不太好让开发人员理解业务
  • 如果存储过程中有复杂运算的话,会增加一些数据库服务端的处理成本

九:高级特性

deterministic(确定性)

  • deterministic说明子程序包含了确定的函数,not deterministic说明子程序包含了不确定的函数。
  • 存储过程执行的语句在二进制中体现,复制保证精确性。
  • 这个特征值还没有被优化程序使用。

SECURITY

1.SQL SECURITY特性说明子程序运行使用创建者的许可才执行,还是使用调用者(invoker)的许可来执行,默认值是DEFINER。
2.可以使没有更新权限的只读用户来执行有更新语句的存储函数。

  • 作者:Not Talk
  • 原文链接:https://blog.csdn.net/qq_39109805/article/details/102758569
    更新时间:2023-02-24 08:47:38