存储过程

 ̄綄美尐妖づ 提交于 2020-01-24 05:13:42
- 存储过程

	- 存储过程的概念

		- 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象

	- 存储过程的种类

		- 系统存储过程

			- 以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作

		- 本地存储过程

			- 用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。

		- 临时存储过程

			- 本地临时存储过程

				- 以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它

			- 全局临时存储过程

				- 以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程 一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。

		- 远程存储过程

			- 远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。

		- 扩展存储过程

			- 扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头

	- 使用方法

		- 语法

			- CREATE PROCEDURE 过程名([IN|OUT|INOUT]参数名 数据类型) 过程体

				- 参数类型

					- in

						- 输入参数

							- 接受外面传进来的参数

					- out

						- 输出参数

							- 只能用作输出,将某个值返回调用处

					- inout

						- 输入输出参数

							- 既可以做输入参数也可以做输出参数返回给调用者

					- 如果仅仅想把数据传给MySQL存储过程,那就使用‘in’类型参数
					- 如果仅仅从MySQL存储过程返回值,那就使用‘out’类型参数
					- 如果需要把数据传给MySQL存储过程,还要经过一些计算传回给我们,此时使用‘inout’类型参数
					- 如果不显式指定参数类型,默认是‘in’类型

			- 创建存储过程

				- CREATE PROCEDURE pro_test()
				BEGIN 
				SELECT NOW() FROM DUAL;
				END

			- 查看指定的存储过程

				- SHOW CREATE PROCEDURE pro_test;

			- 查看所有的存储过程

				- show PROCEDURE STATUS;

			- 删除存储过程

				- DROP PROCEDURE pro_test;

			- 调用存储过程

				- CALL   pro_test();

	- MySQL变量

		- 局部变量(常用)

			- 在begin和end语句块之间,在该语句块里设置的变量
			- 作用范围

				- 只在begin-end语句块之间有效

			- 声明局部变量

				- 声明

					- declare 变量名 数据类型 [defualt]

						- DECLARE v_num INT DEFAULT '10'

							- 声明一个int 类型的局部变量 v_num赋值为10
							- 不赋值默认为null

				- 赋值

					- set:=值或set=值

						- set v_num = '20';
						- set v_num := '20';

			- 局部变量声明时必须 声明数据类型

		- 用户变量(测试用)

			- 用户自定义的变量,以@开始形式为@变量名
			- 作用范围

				- 只对当前用户使用的客户端生效

			- 声明用户变量

				- set @userVar =NULL;
				- select @userVar:='用户变量'

			- 用户变量声明时不需要声明数据类型,它的数据类型可以由运行时赋的值来决定

		- 会话变量

			- 从打开客户端连接服务器到关闭连接的过程称为一个会话,客户端只能更改自己的会话变量
			- 作用范围

				- 当前连接

		- 全局变量

			- 对所有客户端生效
			- 作用范围

				- 全局变量作用于服务器的整个生命周期,但不能重启

		- select into 语句

			- select into语句把选定的列的值直接存储到变量,只有单一的行可以被取回
			- 变量的值和长度必须和对应列的数据类型和长度保持一致

	- 存储过程的优点

		- 存储过程增强了SQL语言灵活性。存储过程可以使用控制语句编写,可以完成复杂的判断和较复杂的运算,有很强的灵活性
		- 减少网络流量,降低了网络负载。存储过程在数据库服务器端创建成功后,只需要调用该存储过程即可,而传统的做法是每次都将大量的SQL语句通过网络发送至数据库服务器端然后再执行
		- 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度
		- 系统管理员通过设定某一存储过程的权限实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全

	- 存储过程的缺点

		- 是面向过程编程
		- 可移植性差

	- 流程控制语句

		- if语句

			- 单分支语句

				- CREATE PROCEDURE pro_if1(in p_pre INT)
					BEGIN
						DECLARE v_city VARCHAR(40);
						SELECT city INTO v_city FROM extend_mobile WHERE pre=p_pre;
						IF v_city = '北京' THEN
							SELECT 1;
						end if;
						SELECT 2;
					END

			- 单分支Else语句

				- CREATE PROCEDURE pro_if2(in p_pre INT)
				BEGIN
				DECLARE v_city VARCHAR(40);
				SELECT city INTO v_city FROM extend_mobile WHERE pre=p_pre;
				IF v_city = '北京' THEN
					SELECT 1;
				ELSE
					SELECT 2;
				end if;
				END

			- 多分支语句

				- CREATE PROCEDURE pro_if3(in p_pre INT)
				BEGIN
				DECLARE v_city VARCHAR(40);
				SELECT city INTO v_city FROM extend_mobile WHERE pre=p_pre;
				IF v_city = '北京' THEN
					SELECT 1;
				ELSEIF v_city='天津' THEN
					SELECT 2;
				ELSE
					SELECT 3;
				end if;
				END

		- case语句

			- CREATE PROCEDURE pro_case1(in p_pre INT)
			BEGIN
			DECLARE v_city VARCHAR(40);
			SELECT city INTO v_city FROM extend_mobile WHERE pre=p_pre;
				CASE v_city
					WHEN '北京' THEN SELECT 1;
					WHEN '天津' THEN SELECT 2;
					WHEN '常州' THEN SELECT 3;
				ELSE SELECT 4;
					END CASE;
			END
			
			- CREATE PROCEDURE pro_case2(in p_pre INT)
			BEGIN
				DECLARE v_city VARCHAR(40);
				SELECT city INTO v_city FROM extend_mobile WHERE pre=p_pre;
				CASE 
					WHEN v_city='北京' THEN SELECT 1;
					WHEN v_city='天津' THEN SELECT 2;
					WHEN v_city='常州' THEN SELECT 3;
				ELSE SELECT 4;
				END CASE;
			END

		- 循环语句

			- while语句

				- CREATE PROCEDURE pro_while()
				BEGIN
					DECLARE sum INT DEFAULT 0;
					DECLARE i INT DEFAULT 1;
					WHILE i<11 DO
						set sum=sum+i;
						set i=i+1;
					END WHILE;
					SELECT sum;
				END
				- while后面的表达式为真执行循环,为假不执行

			- repeat语句

				- CREATE PROCEDURE pro_repeat()
				BEGIN
				DECLARE sum INT DEFAULT 0;
				DECLARE i INT DEFAULT 1;
				repeat
					set sum=sum+i;
					set i=i+1;
				UNTIL i>10
				END REPEAT;
				SELECT sum;
				END
				- 循环执行repeat里面的语句每执行一次判断,为真继续执行,为假跳出

			- loop语句

				- CREATE PROCEDURE pro_loop()
				BEGIN
					DECLARE sum INT DEFAULT 0;
					DECLARE i INT DEFAULT 1;
					loopLabel: loop
						set sum=sum+i;
						set i=i+1;
					IF i >10 then
						LEAVE loopLabel;
					end if;
						END loop loopLabel;
					SELECT sum;
				END
				- loop是死循环 ,要和leave语句联用,必须加标签
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!