十:存储过程和函数

1什么是存储过程和函数:

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

使用好处:

1、简化应用开发人员的很多工作

2、减少数据在数据库和应用服务器之间的传输

3、提高了数据处理的效率

2)创建存储过程

创建存储过程:

create procedure 存储过程名 ([proc_parameter[,]])

[characteristic]routine_body

###创建存储过程

语法: in(输入 需要传参数) out(输出 返回值) inout(输入输出)

create procedure 存储过程名(in|out|inout 参数名  参数类型,...)

begin

存储过程体

 End

create procedure 存储过程名(参数模式 参数名 参数类型)

begin

存储过程体

end

注意:

1.参数模式:inoutinout,其中in可以省略

2.存储过程体的每一条sql语句都需要用分号结尾

二、调用

call 存储过程名(实参列表)

举例:

调用in模式的参数:call sp1‘值’;

调用out模式的参数:set @name; call sp1(@name);select @name;

调用inout模式的参数:set @name=; call sp1(@name); select @name;

三:示例
使用无参进行创建调用
#删除
DROP PROCEDURE myp1;

#声明  注意在命令行里面进行调用,直接调用用报错
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
  INSERT INTO admin(username,`password`) VALUES('Lim','1001'), ('ZhangHao','1001');
END $

#调用
CALL myp1()$;




字符集有问题。
# in 类型参数的调用

CREATE PROCEDURE myp2( IN  girlname VARCHAR(20) )
BEGIN
     SELECT bo.* FROM boys bo RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
     WHERE b.name = girlname;
END $

#调用
CALL myp2('小昭')$


DELIMITER $  //声明结束符的位置代表命令的结束行 $代表结束行
CREATE PROCEDURE myp4( IN username VARCHAR(20) , IN pass VARCHAR(20) )
BEGIN
     DECLARE rt INT DEFAULT 0;
     SELECT COUNT(*)  INTO rt FROM  
     admin WHERE admin.username = username AND admin.password = pass;
     SELECT IF( rt >0,'成功','失败');
END $

CALL myp4('lisi','1001')$

#声明;
CREATE PROCEDURE myp5( IN username VARCHAR(20) , OUT  boyname VARCHAR(20))
BEGIN
   
   SELECT bo.boyName INTO boyname 
   FROM boys bo INNER JOIN  beauty be
   ON bo.id = be.boyfriend_id
   WHERE  be.name = username;
END $


#调用
CALL myp5('小昭',@boyname)$
SELECT @boyname$;

3系统变量

作用域:针对于所有会话(连接)有效,但不能跨重启

查看所有全局变量

SHOW GLOBAL VARIABLES;

查看满足条件的部分系统变量

SHOW GLOBAL VARIABLES LIKE '%char%';

查看指定的系统变量的值

SELECT @@global.autocommit;

为某个系统变量赋值

SET @@global.autocommit=0;

SET GLOBAL autocommit=0;

4会话变量

作用域:针对于当前会话(连接)有效

查看所有会话变量

SHOW SESSION VARIABLES;

查看满足条件的部分会话变量

SHOW SESSION VARIABLES LIKE '%char%';

查看指定的会话变量的值

SELECT @@autocommit;

SELECT @@session.tx_isolation;

为某个会话变量赋值

SET @@session.tx_isolation='read-uncommitted';

SET SESSION tx_isolation='read-committed';

5用户变量

声明并初始化:

SET @变量名=;

SET @变量名:=;

SELECT @变量名:=;

示例:SQL 声明变量

DECLARE NAME VARCHAR(20) DEFAULT '';

SET @name='li si';

SELECT @NAME;

赋值:

方式一:一般用于赋简单的值

SET 变量名=;

SET 变量名:=;

SELECT 变量名:=;

方式二:一般用于赋表 中的字段值

SELECT 字段名或表达式 INTO 变量

FROM ;

使用:

select @变量名;

6局部变量

声明:

   declare 变量名 类型 【default 值】;

赋值:

  方式一:一般用于赋简单的值

  SET 变量名=;

  SET 变量名:=;

  SELECT 变量名:=;

方式二:一般用于赋表 中的字段值

SELECT 字段名或表达式 INTO 变量 FROM ;

使用:

select 变量名

二者的区别:

作用域 定义位置 语法

用户变量 当前会话 会话的任何地方 @符号,不用指定类型

局部变量 定义它的BEGIN END BEGIN END的第一句话 一般不用加@,需要指定类型

(1)创建使用函数

###创建函数

学过的函数:LENGTHSUBSTRCONCAT

语法:

CREATE FUNCTION 函数名(参数名 参数类型,...) RETURNS 返回类型

BEGIN

函数体

END

###调用函数

SELECT 函数名(实参列表)

###函数和存储过程的区别

函数 :FUNCTION SELECT 函数() 只能是一个 一般用于查询结果为一个值并返回时,当有返回值而且仅仅一个

存储过程: PROCEDURE CALL 存储过程() 可以有0个或多个 一般用于更新;

###示例 查询员工总个数


CREATE FUNCTION myf1() RETURNS INT
BEGIN
    DECLARE c INT DEFAULT 0; --声明
    SELECT COUNT(*) INTO c 
    FROM employees;
    RETURN c;  --返回
END $

SELECT myf1()$



CREATE FUNCTION myf2( E_Name  VARCHAR(20) ) RETURNS DOUBLE
BEGIN
    DECLARE sal DOUBLE DEFAULT 0;
    SET @sal=0;
    SELECT salary INTO sal 
    FROM employees WHERE first_name = E_Name;
    RETURN sal;  
END $
DESC employees
SELECT myf2('Steven')$


###调用函数
    SELECT 函数名(实参列表)


##查看函数定义
show create function
##删除

drop function ...
原文地址:https://www.cnblogs.com/love-life-insist/p/12869558.html