美文网首页
8、存储过程

8、存储过程

作者: knock | 来源:发表于2020-07-08 02:42 被阅读0次

8、存储过程

8.1、删除存储过程

DROP PROCEDURE sel;  

8.2、创建存储过程

#---------------------------存储过程-----------------------------------#
delimiter //  ###声明以//为结束符号
CREATE PROCEDURE sel()
BEGIN
SELECT username  FROM student;
END //
#---------------------------存储过程-----------------------------------#
#执行存储过程
CALL sel(); 

8.3、创建使用局部变量的存储过程

DROP PROCEDURE  IF EXISTS sel;   #先删除存储过程

#---------------------------存储过程-----------------------------------#
delimiter //   #声明以//为结束符号
CREATE PROCEDURE sel()
BEGIN

DECLARE name1  VARCHAR(200) DEFAULT '我是局部变量name1';  #声明局部变量
DECLARE name2  VARCHAR(200) DEFAULT '我是局部变量name2';  #声明局部变量

SELECT name1,name2; # 查看局部变量的值

SET name1='ls',name2='s1';  #给局部变量赋值

SELECT  name1,name2;  #查看改变后的局部变量

SELECT username,pwd from student where username=name1 and pwd=name2;   ##将局部变量带入查询条件

END
//

#---------------------------存储过程-----------------------------------#

#执行存储过程
CALL sel(); 

[^]: 局部变量 只在BEGIN ... END 中有效

8.4、创建使用用户变量的存储过程

DROP PROCEDURE  IF EXISTS sel;   #先删除存储过程

set @name='我是用户变量';#申明一个用户变量 

#---------------------------存储过程-----------------------------------#
delimiter //   #声明以//为结束符号
CREATE PROCEDURE sel()
BEGIN

SELECT @name; # 查看用户变量的值

SET @name='ls2';  #给用户变量赋值

SELECT  @name;  #查看改变后的用户变量

SELECT username,pwd from student where username=@name;   #将用户变量带入查询条件

END//
#---------------------------存储过程-----------------------------------#

#执行存储过程
CALL sel(); 

SELECT  @name;

[^]: 用户变量 只在当前会话(连接)中有效

8.5、使用into函数给用户变量赋值

SELECT username into @name from student where username='ls';   #通过into函数 将username的值 赋值给 用户变量

SELECT  @name;  #查看改变后的用户变量

8.6、存储过程的in传参的使用-01

DROP PROCEDURE  IF EXISTS sel;   #先删除存储过程

set @name='我是用户变量';#申明一个用户变量 

#---------------------------存储过程-----------------------------------#
delimiter //   #声明以//为结束符号

CREATE PROCEDURE sel(in in_name VARCHAR(200) )
BEGIN

 SELECT in_name;

 SET in_name='新的in_name';

 SELECT in_name;

END//

delimiter ;  #声明以;为结束符号
#---------------------------存储过程-----------------------------------#

#执行存储过程
CALL sel(@name);

SELECT @name;

[^]: 执行CALL sel(@name)
[^]: 第一次输出in_name 输出 ’我是用户变量‘
[^]: 给in_name赋值 '新的in_name’ 后,第二次 输出in_name 输出 ‘新的in_name‘,再次输出@name,输出’我是用户变量‘

[^]: 故 将用户变量传入 in 声明的 入参参数后, 存储过程中入参参数可以获取用户变量的值,对入参参数进行修改,入参参数在存储过程中改变,但是不会改变用户变量的值
[^]: 总结:执行存储过程时,传入用户变量给 ’用in 声明的入参参数‘ ,相当于给 ’用in 声明的 入参参数‘ 初始化赋值,后面对 ’用in 声明的 入参参数‘,进行修改等任何操作都与用户变量无关

image.png

8.7、存储过程的in传参的使用-02

DROP PROCEDURE  IF EXISTS sel;   #先删除存储过程

set @name='我是用户变量';#申明一个用户变量 

#---------------------------存储过程-----------------------------------#
delimiter //   #声明以//为结束符号

CREATE PROCEDURE sel(in in_name VARCHAR(200) )
BEGIN

 SELECT in_name;

 SET in_name='新的in_name';

 SELECT in_name;

END//

delimiter ;  #声明以;为结束符号
#---------------------------存储过程-----------------------------------#

#执行存储过程
CALL sel('aaaaaaaaaaaaaaaaaaaaaa');

[^]: 执行存储过程时,可传入自定义的变量 给 ’用in 声明的入参参数‘,相当于给 ’用in 声明的 入参参数‘ 初始化赋值,后面对 ’用in 声明的 入参参数‘,进行修改等任何操作都与自定义变量无关

image.png

8.8、存储过程的out传参的使用

DROP PROCEDURE  IF EXISTS sel;   #先删除存储过程

set @name='我是用户变量';#申明一个用户变量 

#---------------------------存储过程-----------------------------------#
delimiter //   #声明以//为结束符号
CREATE PROCEDURE sel(out out_name VARCHAR(200) )
BEGIN

 SELECT out_name;

 SET out_name='新的out_name';

 SELECT out_name;

END//
delimiter ;  #声明以;为结束符号
#---------------------------存储过程-----------------------------------#

#执行存储过程
CALL sel(@name); 

SELECT @name;

[^]: 执行CALL sel(@name)
[^]: 第一次输出out_name 为null
[^]: 给out_name赋值 '新的out_name' 后,第二次 输出out_name为 ‘新的out_name‘,再次输出@name,输出’‘新的out_name‘

[^]: 故 将用户变量传入 out 声明的 出参参数后, 存储过程中出参参数不可以获取用户变量的值,对出参参数进行修改,出参参数在存储过程中改变,并且会改变用户变量的值
[^]: 总结:执行存储过程时,传入用户变量给 ’用out声明的出参参数‘ ,用户变量的值不会赋值给 ’用out声明的出参参数‘,但是当改变 ’用out声明的出参参数‘时,会同时改变用户变量的值
[^]: 执行存储过程时,必须传入用户变量来对应 ‘out声明的出参参数’

image.png

8.9、存储过程的inout传参的使用

DROP PROCEDURE  IF EXISTS sel;   #先删除存储过程

set @name='我是用户变量';#申明一个用户变量 
#---------------------------存储过程-----------------------------------#
delimiter //   #声明以//为结束符号
CREATE PROCEDURE sel(INOUT inout_name VARCHAR(200) )
BEGIN

 SELECT inout_name;

 SET inout_name='新的inout_name';

 SELECT inout_name;

END//

delimiter ;  #声明以;为结束符号
#---------------------------存储过程-----------------------------------#

#执行存储过程
CALL sel(@name); 

SELECT @name;

[^]: 执行CALL sel(@name)
[^]: 第一次输出inout_name为 ‘我是用户变量’
[^]: 给inout_name 赋值 '新的inout_name' 后,第二次 输出inout_name为 ‘新的inout_name‘,再次输出@name,输出’‘新的inout_name‘

[^]: 故 将用户变量传入 inout 声明的 出入参参数后, 存储过程中出入参参数可以获取用户变量的值,对出入参参数进行修改,出入参参数在存储过程中改变,并且会改变用户变量的值
[^]: 总结:执行存储过程时,传入用户变量给 ’用inout声明的出入参参数‘ ,用户变量的值会赋值给 ’用inout声明的出入参参数‘,当改变 ’用inout声明的出入参参数‘时,会同时改变用户变量的值
[^]: 执行存储过程时,必须传入用户变量来对应 ‘inout声明的出入参参数’

image.png

8.10、存储过程的流程判断

IF使用

DROP PROCEDURE  IF EXISTS sel; 

DELIMITER //
CREATE PROCEDURE sel(in  p_customerNumber VARCHAR(11), out p_customerLevel  varchar(10))
BEGIN
    DECLARE creditlim VARCHAR(10);
 
    SELECT pwd INTO creditlim
    FROM student
    WHERE username = p_customerNumber;
 
    IF creditlim = 's1' THEN SET p_customerLevel = '001'; #判断开始
    ELSEIF (creditlim ='s2' OR creditlim = 's3' ) THEN   SET p_customerLevel = '002';
        ELSE SET p_customerLevel = '003';
    END IF; #判断结束
    SELECT p_customerLevel;
END //
 DELIMITER ;
 
CALL sel('ls1',@value); 

CASE使用

DROP PROCEDURE  IF EXISTS sel; 

DELIMITER //
CREATE PROCEDURE sel(in  p_customerNumber VARCHAR(11), out p_customerLevel  varchar(10))
BEGIN
    DECLARE creditlim VARCHAR(10);
    SELECT pwd INTO creditlim
    FROM student
    WHERE username = p_customerNumber;
 CASE creditlim
   WHEN  's1' THEN
    SET p_customerLevel = '111111';
   WHEN 's2' THEN
    SET p_customerLevel = '222222';
   ELSE
    SET p_customerLevel = '333333';
   END CASE;
   SELECT p_customerLevel;
END //
DELIMITER ;
CALL sel('ls1',@value); 

WHILE使用

DROP PROCEDURE  IF EXISTS sel; 

DELIMITER //
CREATE PROCEDURE sel(in a int)
BEGIN
    declare sum int default 0;  -- default 是指定该变量的默认值
        declare i int default 1;
    while i<=a DO -- 循环开始
        set sum=sum+i;
        set i=i+1;
    end while; -- 循环结束
    select sum;  -- 输出结果
        
END //
 DELIMITER ;

CALL sel(3); 

REPEAT使用

DROP PROCEDURE  IF EXISTS sel; 

DELIMITER //
CREATE PROCEDURE sel(in a int)
BEGIN
   declare sum int default 0;
      declare i int default 1;
       repeat -- 循环开始
           set sum=sum+i;
           set i=i+1;
       until i>a 
             end repeat; -- 循环结束
       select sum; -- 输出结果
        
END //
 DELIMITER ;

CALL sel(3); 

LOOP使用

DROP PROCEDURE  IF EXISTS sel; 

DELIMITER //
CREATE PROCEDURE sel()
BEGIN
     DECLARE x  INT;
     DECLARE str  VARCHAR(255);
     SET x = 1;
     SET str =  '';
     
     loop_label:  LOOP #开始
     
     IF  x > 10 THEN
     LEAVE  loop_label;#跳出循环体
     END  IF;
     SET  x = x + 1;
     IF  (x mod 2) THEN
     ITERATE  loop_label; #跳过循环体
     ELSE
     SET  str = CONCAT_WS(',',str,x);
     END  IF;
     
     END LOOP;  #结束开始
     
     SELECT str;

END //
DELIMITER ;

CALL sel(); 


相关文章

  • 8、存储过程

    8、存储过程 8.1、删除存储过程 8.2、创建存储过程 8.3、创建使用局部变量的存储过程 [^]: 局部变量 ...

  • 8、MySQL存储过程

    存储过程 存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。 1、创建存储...

  • (8)用存储过程(CallableStatement)

    存储过程是一组SQL语句,它们构成一个逻辑单元并执行特定的任务,它们用于封装一组操作或查询,以便在数据库服务器上执...

  • Mysql存储过程

    阅读目录:MySQL存储过程_创建-调用-参数 存储过程:SQL中的“脚本” 创建存储过程 调用存储过程 存储过程...

  • MySQL批量添加数据

    创建存储过程 执行存储过程 删除存储过程

  • CI 3 添加oracle存储过程调用功能

    ci3 原有的oci8d存储过程调用功能不能用,自己整了一个 Controller 中调用 ORACLE 存储过程...

  • 17 存储过程

    过程: 函数: 过程是没有返回值的函数 存储过程: 存储过程语法 存储过程1--创建简单的存储过程 存储过程2--...

  • 存储过程

    详见存储过程详解 创建存储过程 使用存储过程 存储过程简介 什么是存储过程:存储过程可以说是一个记录集吧,它是由一...

  • 存储过程与函数

    存储过程与函数存储过程的定义存储过程的创建存储过程的操作自定义函数 存储过程与函数 存储过程的定义 运行效率高 降...

  • 存储过程

    ps 不能修改过程体,要修改过程体必须先删除存储过程,再重建 mysql变量的术语分类: 1.用户变量:以"@"开...

网友评论

      本文标题:8、存储过程

      本文链接:https://www.haomeiwen.com/subject/thzpqktx.html