1.语法

CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body proc_parameter:
[ IN | OUT | INOUT ] param_name type func_parameter:
param_name type type:
Any valid MySQL data type characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER } routine_body:
Valid SQL routine statement

参数详解:

(1)DEFINER

表示创建存储过程及函数的用户,默认为当前用户;

(2)func_parameter

表示存储过程的参数。在Create Procedure 语句中,可以声明一个或多个参数。当调用该存储过程时,用户必须给出所有的参数值,除非定义了参数的缺省值。若参数的形式以 @parameter=value 出现,则参数的次序可以不同,否则用户给出的参数值必须与参数列表中参数的顺序保持一致。若某一参数以@parameter=value 形式给出,那么其它参数也必须以该形式给出。一个存储过程至多有1024 个参数。

(3)characteristic

  • LANGUAGE SQL:表示此存储过程和函数的创建语言;
  • [NOT] DETERMINISTIC:表明输入相同的参数会返回相同的结果,反之表示相同的参数不会是相同的结果,默认是not deterministic;
  • -- CONTAINS SQL :子程序不包含读或写数据的语句;
  • -- NO SQL : 子程序不包含SQL语句;
  • -- READS SQL DATA :子程序包含读数据的语句;
  • -- MODIFIES SQL DATA : 子程序包含写数据的语句;
  • -- 如果这些特征没有明确给定,默认的是CONTAINS SQL;

(4)SQL SECURITY { DEFINER | INVOKER }

子程序该用创建子程序者的许可来执行,还是使用调用者的许可来执行。默认值是DEFINER。

(5)COMMENT

是一个MySQL的扩展,它可以被用来描述存储程序。这个信息被SHOW CREATE PROCEDURE和 SHOW CREATE FUNCTION语句来显示。

2.存储过程与函数特性

(1)存储过程与函数的区别

  • 函数调用有返回值
  • 存储过程调用用call语句,函数调用直接饮用函数名+参数

(2)Definer和sql security

  • Definder是MySQL的特殊访问控制手段,当数据库当前没有这个用户权限时,执行存储过程可能会报错;
  • sql security的值决定了调用存储过程的方式,取值:definer(默认)或invoker;
  • definer在执行时先验证definer对应的用户,如:cdq@127.0.0.1是否存在,以及是否具有执行存储过程的权限,若没有则报错;
  • invoker在执行存储过程时判断invoker,即调用该存储过程的用户是否有相应权限,若没有则报错

(3)IN,OUT,INOUT

只适用于存储过程,对函数而言所有参数默认都是输入参数

  • IN用于把数值传入到存储过程中
  • OUT用于输出参数将数值传递给调用者
  • INOUT输入输出参数把数据传入到存储过程,在存储过程中修改后再传递给调用者

3.实例演示

(1)简单存储过程

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> delimiter ;
mysql> call simpleproc(1,@a);
Query OK, 1 row affected (0.00 sec) mysql> select @a;
+------+
| @a |
+------+
| 7 |
+------+
1 row in set (0.00 sec)

说明:

  • delimiter命令是改变语句的结束符,MySQL默认结束符为;号,由于存储过程和函数中的;号并不代表结束,所以要替换另外的结束符;

(2)简单的函数

mysql> create function hello(s char(20))
-> returns char(50)
-> return concat('Hello',s,'!');
Query OK, 0 rows affected (0.00 sec) mysql> select hello('world');
+----------------+
| hello('world') |
+----------------+
| Helloworld! |
+----------------+
1 row in set (0.00 sec)

(3)复杂的示例

mysql> delimiter //
mysql> create function simplefunc(param1 int)
-> returns int
-> begin
-> update students set gender=1 where sid=param1;
-> select count(*) into @a from students where sid > param1;
-> return @a;
-> end//
Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
mysql> select * from students where sid=1;
+-----+--------+--------+---------+
| sid | sname | gender | dept_id |
+-----+--------+--------+---------+
| 1 | Andrew | 0 | 1 |
+-----+--------+--------+---------+
1 row in set (0.00 sec) mysql> select simplefunc(1);
+---------------+
| simplefunc(1) |
+---------------+
| 7 |
+---------------+
1 row in set (0.03 sec) mysql> select * from students where sid=1;
+-----+--------+--------+---------+
| sid | sname | gender | dept_id |
+-----+--------+--------+---------+
| 1 | Andrew | 1 | 1 |
+-----+--------+--------+---------+
1 row in set (0.01 sec)

说明:

  • MySQL存储过程和函数中也可以包含类似create和drop等DDL语句;
  • rontine_body子句可以包含一个简单的SQL语句,也可以包含多个SQL语句,通过begin...end将多个SQL语句包含在一起;

4.测试definer

[root@localhost ~]# mysql -uabc2 -p
Enter password: mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| course |
+--------------------+
2 rows in set (0.01 sec) mysql> use course;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> delimiter //
mysql> create procedure simpleproc2(IN param1 int,out param2 int)
-> begin
-> select count(*) into param2 from students where sid > param1;
-> end//
Query OK, 0 rows affected (0.00 sec) [root@localhost ~]# mysql -p
Enter password: mysql> use course;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> call simpleproc2(1,@a);
Query OK, 1 row affected (0.00 sec) mysql> drop user 'abc2'@'localhost';
Query OK, 0 rows affected (0.00 sec) mysql> call simpleproc2(1,@a);
ERROR 1449 (HY000): The user specified as a definer ('abc2'@'localhost') does not exist 查看存储过程及函数的相关数据库信息(在information_schema库)
mysql> select ROUTINE_SCHEMA,ROUTINE_NAME,ROUTINE_TYPE,ROUTINE_BODY,ROUTINE_DEFINITION,DEFINER from ROUTINES where ROUTINE_SCHEMA = 'course';
+----------------+--------------+--------------+--------------+-------------------------------------------------------------------------------------------------------------------------------+----------------+
| ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | ROUTINE_BODY | ROUTINE_DEFINITION | DEFINER |
+----------------+--------------+--------------+--------------+-------------------------------------------------------------------------------------------------------------------------------+----------------+
| course | hello | FUNCTION | SQL | return concat('Hello',s,'!') | root@localhost |
| course | simplefunc | FUNCTION | SQL | begin
update students set gender=1 where sid=param1;
select count(*) into @a from students where sid > param1;
return @a;
end | root@localhost |
| course | simpleproc | PROCEDURE | SQL | begin
select count(*) into param2 from students where sid > param1;
end | root@localhost |
| course | simpleproc2 | PROCEDURE | SQL | begin
select count(*) into param2 from students where sid > param1;
end | abc2@localhost |
+----------------+--------------+--------------+--------------+-------------------------------------------------------------------------------------------------------------------------------+----------------+ mysql> alter procedure simpleproc2 sql security invoker;
Query OK, 0 rows affected (0.00 sec) mysql> call simpleproc2(1,@a);
Query OK, 1 row affected (0.00 sec)

说明:

相关属性短语只有咨询含义,并不是强制性约束

  • contains sql表明此存储过程或函数不包含读或者写数据的语句,这是默认属性;
  • no sql表明此存储过程或函数不包含SQL语句
  • reads sql data表示此存储过程包含诸如select的查询数据的语句,但不包含插入或删除数据的语句
  • modifies sql data表示存储过程包含插入或删除数据的语句

5.删除语句

DROP {procedure | function} {IF EXISTS} sp_name;

if exists用来避免在删除一个本身不存在的存储过程或函数时,MySQL返回错误;

mysql> drop procedure oldboy;
ERROR 1305 (42000): PROCEDURE course.oldboy does not exist
mysql> drop procedure if exists oldboy;
Query OK, 0 rows affected, 1 warning (0.00 sec)

6.查看存储过程及函数

mysql> show create procedure simpleproc;
+------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| simpleproc | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `simpleproc`(in param1 int,out param2 int)
begin
select count(*) into param2 from students where sid > param1;
end | utf8 | utf8_general_ci | latin1_swedish_ci |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
mysql> show create function simplefunc;
+------------+-------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Function | sql_mode | Create Function | character_set_client | collation_connection | Database Collation |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| simplefunc | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` FUNCTION `simplefunc`(param1 int) RETURNS int(11)
begin
update students set gender=1 where sid=param1;
select count(*) into @a from students where sid > param1;
return @a;
end | utf8 | utf8_general_ci | latin1_swedish_ci |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)

MySQL-5.7 存储过程及函数的更多相关文章

  1. MySQL中的存储过程和函数使用详解

    一.对待存储过程和函数的态度 在实际项目中应该尽量少用存储过程和函数,理由如下: 1.移植性差,在MySQL中的存储过程移植到sqlsever上就不一定可以用了. 2.调试麻烦,在db中报一个错误和在 ...

  2. MySQL基础值 存储过程和函数

    一.创建存储过程和函数 什么是创建存储过程和函数? 就是将经常使用的一组SQL语句组合在一起,并将这些SQL语句当做一个整体存储在MYSQL服务器中. 创建存储过程的语句是:CREATE  PROCE ...

  3. MySQL中的存储过程和函数

    存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如何创建存储过程和存储函数,以及如何调用.查看.修改.删除存储过程和存储函 ...

  4. MySQL教程之存储过程与函数

    存储程序分为存储过程和函数 可以使用CALL来调用存储过程,只能输出变量返回值.存储过程可以调用其他存储过程 函数可以从语句外调用,也能返回标量值 什么是存储过程? 简单的说,就是一组SQL语句集,功 ...

  5. MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别

    1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...

  6. MySQL中的存储过程、函数与触发器

    一.对待存储过程和函数的态度 优点: 1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译.能提高数据库执行速度. 2.简单复杂操作结合事物一起封装. 3.复用性高. 4.安全性高,可指定存 ...

  7. <MySQL>入门七 存储过程和函数

    -- 存储过程和函数 /* 存储过程和函数:类似java中的方法 好处: 1.提高代码的重用性 2.简化操作 */ /* 存储过程 含义:一组预先编译好的SQL语句的集合.理解成批处理语句 1.提高代 ...

  8. Mysql变量、存储过程、函数、流程控制

    一.系统变量 系统变量: 全局变量 会话变量 自定义变量: 用户变量 局部变量 说明:变量由系统定义,不是用户定义,属于服务器层面 注意:全局变量需要添加global关键字,会话变量需要添加sessi ...

  9. MySql视图、存储过程、函数、索引

    一.视图 视图是查询命令结果构成的一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集合,并可以当作表来查询使用. 1创建视图 - ...

  10. 八、mysql视图、存储过程、函数以及时间调度器

    .create or replace view emp_view as select * from t4 ;给t4表创建一个名为emp_view的视图 .drop view emp_view 删除视图 ...

随机推荐

  1. redis php 实例一

    下面的例子都是基于php-redis这个扩展的. 1,connect 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返 ...

  2. VR应用开发遍地走的日子还有多远

    从上世纪60年代美国计算机科学家Ivan Sutherland发明的第一款真正意义上的虚拟现实头盔,到Facebook以20亿美元收购"虚拟现实之眼"Oculus Rift,大批厂 ...

  3. 数据库设计——E-R图

    一,复习下基础 1.弱实体 这样的实体须要依赖还有一个实体.若还有一个实体不存在了.它也随之消失.相对而言,它依赖的那个实体成为强实体. 2,特殊化 在数据库设计的过程中,我们会发现.一个实体能够依照 ...

  4. iOS-.pch如何使用

    今天我们要说的是.pch这个文件 我相信大家并不陌生,因为如果是新手开发工程师 总会被它搞得总报错误. 那么我们要知道.pch到底是干什么的,说白了就是一个预编译文件,在运行程序之前,要对头文件等一些 ...

  5. Xcode删除Project上层group

    本来想在Project下New Group,结果点了New group from selection, 结果在Project上级新建了一个group,邮件菜单中无删除项…… 解决方法: 1,关闭Xco ...

  6. ASP.Net请求处理机制初步探索之旅 - Part 3 管道(转)

    开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest().HttpRuntime.ProcessReq ...

  7. 解决----------“win10,不能打字了,已禁用IME”

    登录Windows 10系统桌面后,右键点击左下角的开始菜单图标,然后在弹出菜单中选择“计算机管理”菜单项在打开的“计算机管理”窗口中,找到左侧系统工具下的“任务计划程序”菜单项点击任务计划程序前面的 ...

  8. navicat 中执行sql脚本 喊中文错误

    执行内容和上篇一样,只是换了工具. 执行成功,但是数据库对应中文没有内容. sql脚本的编码是asci 执行的时候选择gbk 编码

  9. JavaScript 入门之常见对象

    常见对象 1. Object 对象 2. String 对象 3. Array 对象 4. Date 对象 5. Number 对象 6. 自定义对象 with 语句 为了简化对象调用内容的书写 格式 ...

  10. shell脚本杂

    1.sh -x 跟踪shell脚本中的每个命令 [root@master shellexer]# cat bash.sh #!/bin/bash var=$ echo $var [root@maste ...