暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

MySQL存储过程和函数

原创 苏苏 恩墨学院 2021-12-20
600

使用语法


create procedure 用来创建存储过程,

create function用来创建函数

create procedure/function语句区别:

  • 函数与存储过程最大的区别就是函数调用有返回值,调用存储过程用call语句,而调用函数就直接引用函数名+参数即可
  • definer和sql security子句指定安全环境
  • definder是MySQL的特殊的访问控制手段,当数据库当前没有这个用户授权时,执行存储过程可能会报错
  • sql security的值决定了调用存储过程的方式,取值:definer(默认)或者invoker
  • definer:在执行存储过程前验证definer对应的用户如:cdq@127.0.0.1是否存在,以及是否具有执行存储过程的权限,若没有则报错
  • invoker:在执行存储过程时判断invoker即调用存储过程的用户是否有相应权限,若没有则报错
  • in,out,input三个参数前的关键词只适用于存储过程,对函数而言所有的参数都是输入参数
  • in输入参数用于把数值传入到存储过程中;out输出参数将数值传递调用者,初始值是null,inout输入输出参数把数据传入到存储过程,在存储过程中修改之后再传递到调用者。

创建一个存储过程:

但是只能返回一个值,如果返回值多的话就不行了,


    mysql> delimiter //
    mysql> create procedure simpleproc (in param1 int,out param2 int)
        -> begin
        -> select count(*) into param2 from students where sid>param1;
        -> end;
        -> //
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> call simpleproc(1,@2);//
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select @2;
        -> //
    +------+
    | @2   |
    +------+
    |   11 |
    +------+
    1 row in set (0.00 sec)
    mysql> 

创建一个函数:

  mysql> delimiter //
   mysql> create function hello (s char(20))
       -> returns char(50)
       -> return concat('Hello',s,'~');
       -> //
   ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
   mysql> 
mysql> show variables like '%log_bin_trust%';
      -> //
  +---------------------------------+-------+
  | Variable_name                   | Value |
  +---------------------------------+-------+
  | log_bin_trust_function_creators | OFF   |
  +---------------------------------+-------+
  1 row in set (0.50 sec)
  
  mysql> 
  全局设置参数mysql> set global log_bin_trust_function_creators=on;
      -> //
  Query OK, 0 rows affected (0.00 sec)
mysql> delimiter //
 mysql> create function hello (s char(20))
     -> returns char(50)
     -> return concat('Hello',s,'~');
     -> //
 Query OK, 0 rows affected (0.03 sec)
 
 mysql>mysql> select hello('narisu');
     -> //
 +-----------------+
 | hello('narisu') |
 +-----------------+
 | Hellonarisu~    |
 +-----------------+
 1 row in set (0.02 sec)
 mysql> 
函数的简单使用
mysql> select hello(sname) from students;//
  +-----------------+
  | hello(sname)    |
  +-----------------+
  | Hellonarisu~    |
  | Hellogutianle~  |
  | Hellobbb~       |
  | Helloccc~       |
  | Hellonight~     |
  | Helloaa_aa~     |
  | Helloavvvvaccc~ |
  | Helloab~        |
  | Helloabcad~     |
  | Helloa~         |
  | Helload~        |
  | Helloa%~        |
  +-----------------+
  12 rows in set (0.02 sec)

函数结合SQL使用

    mysql> select ROUTINE_CATALOG,ROUTINE_NAME,ROUTINE_TYPE,CREATED from ROUTINES  order by created desc limit 3;
    +-----------------+--------------+--------------+---------------------+
    | ROUTINE_CATALOG | ROUTINE_NAME | ROUTINE_TYPE | CREATED             |
    +-----------------+--------------+--------------+---------------------+
    | def             | hello        | FUNCTION     | 2021-12-19 18:03:17 |
    | def             | simpleproc   | PROCEDURE    | 2021-12-19 17:52:02 |
    | def             | simpleproc1  | PROCEDURE    | 2021-12-19 17:48:39 |
    +-----------------+--------------+--------------+---------------------+
    3 rows in set (0.00 sec)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论