zoukankan      html  css  js  c++  java
  • MySql存储过程

    一、什么是存储过程

    简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;

    ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;

    二、有哪些特性

    有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;

    函数的普遍特性:模块化,封装,代码复用;

    速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;

    三、创建一个简单的存储过程

    存储过程will_add功能很简单,两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum

    几点说明:

    DELIMITER $$  把默认的输入的结束符;替换成$$

     1 DROP PROCEDURE IF EXISTS `will_add`;#删除已经存在的存储过程
     2 delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
     3 create procedure will_add(in a int, in b int, out sum int)
     4 begin
     5     if a is null then
     6         set a = 0;
     7     end if;
     8     if b is null then
     9         set b = 0;
    10     end if;
    11     set sum = a + b;
    12 end$$
    13 delimiter ; #将语句的结束符号恢复为分号

    调用存储过程:call procedure_name(参数)

    四、查看数据库有哪些存储过程

    1.查看数据库中的存储过程:show procedure status;

    2.查看某个存储过程的创建代码:show create procedure proc_name;

    五、存储过程中的控制语句

    1.IF语句

     1 drop procedure if exists `will_if`;
     2 delimiter $$
     3 create procedure will_if(in type int)
     4 begin
     5     declare c varchar(128) default '';
     6     if(type = 0 || type = 1) then
     7         set c = 'param is 0/1';
     8     elseif type = 2 then
     9         set c = 'param is 2';
    10     else
    11         set c = 'param is others, not in(0,1,2)';
    12     end if;
    13     select c;
    14 end$$
    15 delimiter ;

    2.CASE语句

     1 drop procedure if exists `will_case`;
     2 delimiter $$
     3 create procedure will_case(in type int)
     4 begin
     5     declare c varchar(128) default '';
     6     case type
     7     when 0 then
     8         set c = 'param is 0';
     9     when 1 then
    10         set c = 'param is 1';
    11     else
    12         set c = 'param is others, not in(0,1)';
    13     end case;
    14     select c;
    15 end$$
    16 delimiter ;

    3.while循环

     1 drop procedure if exists `will_while`;
     2 delimiter $$
     3 create procedure will_while(in n int)
     4 begin
     5     declare i int;
     6     declare s int;
     7     set i = 0;
     8     set s = 0;
     9     while i <= n do
    10         set s = s + i;
    11         set i = i + 1;
    12     end while;
    13     select s;
    14 end$$
    15 delimiter ;

    六、存储过程中的参数

    存储过程可以有0个或多个参数,用于存储过程的定义。

    3种参数类型:

    IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)

    OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

    INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

    1.in输入参数

    1 drop procedure if exists `will_in`;
    2 delimiter $$
    3 create procedure will_in(in p_in int)
    4 begin
    5     select p_in;
    6     set p_in = 2;
    7     select p_in;
    8 end$$
    9 delimiter ;

    p_in在存储过程中被修改,但并不影响@p_in的值;因为前者为局部变量,后者为全局变量

    2.out输出参数

    1 drop procedure if exists `will_out`;
    2 delimiter $$
    3 create procedure will_out(out p_out int)
    4 begin
    5     select p_out;
    6     set p_out = 2;
    7     select p_out;
    8 end$$
    9 delimiter ;

    3.inout输入输出参数

    1 drop procedure if exists `will_inout`;
    2 delimiter $$
    3 create procedure will_inout(inout p_inout int)
    4 begin
    5     select p_inout;
    6     set p_inout = 2;
    7     select p_inout;
    8 end$$
    9 delimiter ;

    七、存储过程的变量

    1.定义变量

    declare var_name data_type [default value](如果没有default子句,初始值为NULL)

    例:declare myparam int default 100;

    2.为变量赋值

    set var_name=expr

    例:
    declare var1, var2, var3 int;
    set var1=10, var2=20;
    set var3=var1+var2;

    Mysql还可以通过select...into为一个或多个变量赋值
    declare name char(50);
    declare id decimal(8,2);
    select id,name into id,name from table_name where id = 2;

  • 相关阅读:
    DOM
    JavaScript 数组的方法总结
    vuex 状态持久化插件 —— vuex-persistedstate
    移动端1px细线
    CSS多行文本并显示省略号
    Java面试题
    Git提交分支
    Redis的安装配置
    Spring IoC
    单例模式
  • 原文地址:https://www.cnblogs.com/573583868wuy/p/8306668.html
Copyright © 2011-2022 走看看