1:介绍

存储过程和函数是事先经过编译并存储在数据库中的一段sql语句的集合。

2: 存储过程和函数的区别

函数必须有返回值,而存储过程没有。
存储过程的参数可以是IN,OUT,INOUT,类型,而函数只能是IN。

3:优点:

存储过程只在创建时进行编译,而sql语句每次执行都需要编译,所以存储过程可以提高数据库执行速度。
简化复杂操作,结合事务一起封装。
复用性好;
安全性高,可指定存储过程的使用权。

4:创建存储过程的语法

案例1:

创建一个存储过程p1
CALL p1();
调用p1方法 里的查询语句

CREATE PROCEDURE 存储过程名(参数体) 
BEGIN 
	sql语句;
END

存储过程的参数形式:[IN | OUT | INOUT]参数名  类型
    IN   输入参数
    OUT  输出参数
    INOUT 输入输出参数


-- BEGIN  和 END 相当于java代码中 {}

DELIMITER $$  -- 修改结束符号
-- 创建 存储过程  存储过程名
CREATE PROCEDURE  pro() 
BEGIN 
	-- 查询t_stu表的信息
	SELECT * FROM t_stu;	
END
$$
--调用 相当于查询
CALL pro();



简介:
DELIMITER $$
CREATE PROCEDURE p1()
BEGIN
	SELECT * FROM t_stu;
END
$$
CALL p1();

@ delimiter $ $:
他与存储过程无关 delimiter 语句将标准分割符–分号(;)
更改 $ $ , 因为我们想将存储过程 作为一个整体传递给服务器,而不是让mysql 工具一次解析每个语句,告诉mysql解析器 ,该段命令是否已经结束了,mysql是否可以执行了,默认情况下delimiter是分号;。在命令行客户端中,如果有一行以分号结束,那么回车 后执行 改命令,但是有的时候,不希望mysql这么做。在为可能输入较多的语句,且 语句包含有分号,使用delimiterr $ $ 这样只有$$出现之后mysql解析器解析执行这段语句;

案例2:

1)参数 IN 类型

创建一个 t1表
有id 和 name两个字段
对t1表中进行插入存储过程
定义入参 a
定义i = 0
第一次循环 如果i<a 就去t1表里新增数据 并加密
再给i加1

CALL p4(20)
插入20条

--创建t1表
CREATE TABLE t1(
id INT , 
NAME VARCHAR(100)
)

-- 对t1表中进行插入存储过程
DELIMITER $$
CREATE PROCEDURE p4(IN a INT)
BEGIN
	-- DECLARE 定义一个变量i
	-- 类似 int i = 0
	DECLARE i INT DEFAULT 0;
	WHILE(i<a)  DO
		INSERT INTO t1 VALUES(i,MD5(i));
		SET i = i+1;
	END WHILE;
END $$

-- 调用
CALL p4(20);

mysql 存储过程

2)参数 out 类型

查询t1表里的数据 赋给abc
调用存储过程 查询
ti表里有多少条数据 abc就展示几

-- 先查询@abc对象的值,为null
SELECT @abc;

-- 创建一个存储过程 
DELIMITER //
-- abc为形参
CREATE PROCEDURE p5(OUT abc INT)
BEGIN	
	-- 将统计到的结果 into赋值给 abc形参
	SELECT COUNT(*) INTO abc FROM t1;
END//

-- 调用存储过程
CALL p5(@abc);

-- 查询@abc ,结果为 20
SELECT @abc;

mysql 存储过程

2.2:

去查询t_stu表 stu_NAME 为"111" 的数据有几条
p1是入参 把查询到的数据赋给p1
调用方法后查询
call 调用方法
select查询 有几条

-- 创建一个存储过程
DELIMITER //
CREATE PROCEDURE p6(IN p1 VARCHAR(50) , OUT p2 INT)
BEGIN
	SELECT COUNT(*) INTO p2 FROM t_stu WHERE stu_NAME = p1;
END//
-- 调用存储过程
CALL p6('111',@num);
-- 查询@cc
SELECT @num;

mysql 存储过程

3)参数 inout 类型

判断p1是否为空 不为null 就给p1加1
为空就给p1赋值为100
第一次查询为空会给p1赋值为100
第二次调用存储过程再查询会赋值为101
调用存储过程后再查询会加1

-- 创建一个存储过程
DELIMITER//
CREATE PROCEDURE p7(INOUT p1 INT)
BEGIN
	IF(p1 IS NOT NULL) THEN
		SET p1 = p1+1;
	ELSE 
		SET p1 = 100;
	END IF;
END//
-- 查询@cc
SELECT @aaa;
-- 调用存储过程
CALL p7(@aaa);

mysql 存储过程

相关文章: