美文网首页
MySQL 存储过程

MySQL 存储过程

作者: 乘风破浪的姐姐 | 来源:发表于2020-07-23 17:52 被阅读0次

MySQL 5.0以上版本已经支持存储过程。
存储过程是一个可编程的函数,在数据库中创建并保存。它有SQL语句和一些特殊的控制结构组成。
MySQL存储过程的创建和调用

语法格式:

CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过程体
DELIMITER //  
CREATE PROCEDURE my_pro(OUT s int)    
BEGIN     
SELECT COUNT(*) INTO s FROM demo;    
END   //
DELIMITER ;

MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意思是把分隔符还原。除了\符号外,任何字符都可以用于语句分隔符。记得在使用新的符号作为结束分隔符后,要记得还原。

存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种:IN,OUT,INOUT。
IN 输入参数
表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数
该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数
调用时指定,并且可被改变和返回

存储过程过程体的开始与结束使用BEGIN与END进行标识。

执行存储过程(调用)
Call关键字:Call接受存储过程的名字以及需要传递给他的任意参数。存储过程可以显示结果,也可以不显示结果。

以下是MySQL实例使用各种类型的语句说明存储过程的使用。
1、条件语句if-then-else

delimiter //    //解释使用新的符号//作为结束分隔符
DROP PROCEDURE IF  EXISTS discounted_price;
CREATE  PROCEDURE discounted_price
(
 IN normal_price NUMERIC(8,2),
 OUT discounted_price NUMERIC(8,2)
)
BEGIN
    IF (normal_price > 500) and (normal_price < 1000) THEN
        SET discounted_price = normal_price * .8;
  ELSEIF (normal_price >=1000) THEN
    SET  discounted_price = normal_price * .9;
  ELSE
    SET discounted_price = normal_price;
  END IF; 
END//     // 结束用新的分隔符
delimiter ;   //重新还原默认的分号分隔符

调用存储过程

CALL discounted_price(800,@disprice);
SELECT @disprice;

2、case语句

delimiter //
create procedure pro_insert(in param int)
begin
case param
when 0 then
insert into student3(studentname) VALUES('利玉3');
when 1 then
insert into student3(studentname) VALUES('利玉4');
else
insert into student3(studentname) VALUES('default');
end case;
end//
delimiter;

调用存储过程

call pro_insert(2);

3、循环语句while-end while

delimiter //
create procedure pro_insert2(in param int)
begin
    while param<10 do
        insert into student3(studentname) VALUES('小猪');
        set param=param+1;
    end while;
end//
delimiter;

调用存储过程

call pro_insert2(6);
delimiter //
CREATE PROCEDURE simple_while(out counter int)
BEGIN
        SET counter = 0;
    while counter != 10 DO
       set counter = counter + 1;
    end while;
END//
delimiter;

调用存储过程

CALL simple_while(@counter);
SELECT @counter;

4、repeat...end repeat
它在执行操作后检查结果,而while则是执行前进行检查。相当于do...while
until表示满足后边的条件才继续循环

delimiter //
create procedure pro_insert3(in param int)
begin
    repeat
    insert into student3(studentname) VALUES('demo');
    set param=param+1;
    until param>10
    end repeat;
end//
delimiter;

调用存储过程

call pro_insert3(8);

5、loop...end loop语句

delimiter//
CREATE PROCEDURE simple_loop(OUT counter INT)
BEGIN
     SET counter = 0;
   my_simple_loop:LOOP
       SET counter = counter +1;
        if counter = 10 THEN
        LEAVE my_simple_loop;
        end if;
   end LOOP my_simple_loop;
END //
delimiter;

调用存储过程

CALL simple_loop(@counter);
SELECT @counter;

检查存储过程相关语句:
删除存储过程
DROP PROCEDURE 存储过程名称;

输出创建存储过程的语句
SHOW CREATE PROCEDURE 存储过程名称;

获取存储过程的详细信息,包括何时,由谁创建等信息,输出的为数据库中所有的存储过程
SHOW PROCEDURE STATUS;

关键字LIKE限制过程输出,输出指定的存储过程
SHOW PROCEDURE STATUS LIKE ‘ 存储过程名称’;

相关文章

  • 15 MySQL 存储过程

    MySQL 存储过程 [toc] 存储过程概述 存储过程介绍 存储过程,相当于是 MySQL 语句组成的脚本 指的...

  • 存储过程

    使用存储过程 1.存储过程 ​ 需要MySQL5---->> MySQL5添加了对存储过程的支持。 ​ 迄...

  • MySQL存储过程详解 mysql 存储过程

    原文链接 MySQL存储过程详解 1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然...

  • Mysql存储过程

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

  • 面试官突然问我MySQL存储过程,我竟然连基础都不会!(详细)

    MySQL存储过程 一、存储过程 1.1 什么是存储过程 存储过程(Stored Procedure)是在大型数据...

  • MySQL存储过程创建及调用方法

    MySQL存储过程是一个sql语句,那么我们如何创建呢,MySQL存储过程创建及修改,删除操作。 1,存储过程创建...

  • 存储过程

    创建存储过程 mysql: 执行存储过程 mysql: 使用OUT参数和INOUT参数: PREPARE和EXEC...

  • SQL基本语句(以MySQL为例)-- 第五部分

    19、使用存储过程MySQL的存储过程的语句跟这本书上的差太远了吧,以下参考自:MySQL存储过程教程 20、管理...

  • MySQL存储过程和存储函数

    一、存储过程 MySQL存储过程存储过程和存储函数参考文章 SQL语句需要先编译然后执行,而存储过程(Stored...

  • MySQL存储过程

    1、关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这...

网友评论

      本文标题:MySQL 存储过程

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