zoukankan      html  css  js  c++  java
  • 存储过程和存储函数

    grade表:

    select * from grade;
    +----+------+--------+------+-------+-------+
    | id | name | sexy   | age  | score | class |
    +----+------+--------+------+-------+-------+
    |  1 | a    | male   |   15 |    90 | A(1)  |
    |  2 | b    | male   |   13 |    97 | A(1)  |
    |  3 | c    | female |   15 |    79 | A(2)  |
    |  4 | a    | female |   13 |   100 | B(1)  |
    |  5 | d    | male   |   16 |    89 | B(2)  |
    |  6 | e    | male   |   16 |    97 | B(2)  |
    |  7 | f    | female |   15 |    93 | B(3)  |
    |  8 | g    | female |   13 |    88 | C(1)  |
    |  9 | h    | male   |   14 |    91 | C(2)  |
    +----+------+--------+------+-------+-------+

     创建存储过程p_grade

    delimiter &&
    create procedure p_grade(in g_id int,out g_name varchar(20))
    begin
    declare g_score varchar(20);
    select score into g_score from grade where id = g_id;
    select name into g_name from grade where id = g_id;
    select g_score;
    end
    &&
    delimiter ;
    call p_grade(1,@n);
    +---------+
    | g_score |
    +---------+
    | 90      |
    +---------+
    select @n;
    +------+
    | @n   |
    +------+
    | a    |
    +------+

    1.参数g_name的作用范围是begin...end之间

    2.declare声明的变量作用范围是begin...end之间

    3.declare必须在所有set前面,即使是变量g_name,也必须在所有declare之后赋值。

    4.declare可以声明多个变量,但是多个变量的类型必须一致。

      正确语法:declare a,b,c int default 10;

      错误语法: declare a int,b int,c int;

    5.sql语句中为了给g_score和g_name赋值,使用了两条select语句。简洁写法如下

       select score,name into g_score,g_name from grade where id = g_id;

    创建存储函数f_grade

    delimiter &&
    create function f_grade(g_id int)
    returns varchar(20)
    begin
    declare g_name varchar(20) default '';
    select name into g_name from grade where id = g_id;
    return g_name;
    end
    &&
    delimiter ;
    select f_grade(1);
    +------------+
    | f_grade(1) |
    +------------+
    | a          |
    +------------+

    1.存储函数的参数列表没有In,out或者inout关键字,所有参数都为输入参数

    2.必须有返回值

      returns 返回类型

    这和高级编程语言函数返回空值void是有区别的

    返回类型后面不能有分号,分号只能出现在begin...end之间

    3.begin...end之间必须有return ***。一般放在end之前,理由同高级编程语言函数中return的位置

    4.存储函数bein...end之间不能有select输出

    创建存储过程p_grade3 

    delimiter &&
    create procedure p_grade3(in c_score int)
    comment 'index g_score'
    begin
    declare cmp tinyint;
    declare count int;
    declare g_score int;
    declare cur_score cursor for select score from grade;
    select count(*) into count from grade;
    open cur_score;
    while count > 0 do
    fetch cur_score into g_score;
    select g_score;
    insert into test (score) values (g_score);
    set count = count - 1;
    end while;
    close cur_score;
    end
    &&
    delimiter ;

    存储过程中循环输出了游标里面的所有记录

    定义条件和处理程序

    delimiter &&
    create procedure p_grade2()
    begin
    declare duplicate_entry condition for sqlstate '23000';
    declare continue handler for duplicate_entry set @message = 'duplicate_entry';
    set @count = 1;
    insert into grade (id) values (9);
    set @count = @count + 1;
    end
    &&
    delimiter ;

    1.grade表id字段是自增主键,不允许重复插入相同值

    2.sqlstate或者mysql_error_code可以通过事先insert into grade (id) values (9);根据控制台的错误信息得到

    ERROR 1062 (23000): Duplicate entry '9' for key 'PRIMARY'

    3.处理程序中

    set @message = 'duplicate_entry'

    该段语句是发生错误时的处理代码,必须和handler for在同一行

    4.在执行 

      insert into grade (id) values (9);

    如果没有发生错误,那么继续执行后面的set @count = @count + 1;

    如果发生了错误,由于处理程序的handle_type是continue,那么仍然继续执行后续语句,当前插入失败,并且处理程序的处理语句 set @message  = 'duplicate_entry'被执行;

     

     

      

     

  • 相关阅读:
    JSP内置对象
    java 中list还有array的区别
    js动态修改界面碰见的疑惑
    购物多条件商品查询逻辑处理
    数据库信息备份
    关于毕设的一些小问题
    在<a></a>标签中正确调用javaScript脚本
    oracle实训0705经验
    第十五天学习进度--数列找规律算法(预测算法)(1)
    第十四天学习进度--相关系数和显著水平
  • 原文地址:https://www.cnblogs.com/bibiafa/p/9328282.html
Copyright © 2011-2022 走看看