A.004.11.Mysql 存储函数

Posted 数据库BOSS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A.004.11.Mysql 存储函数相关的知识,希望对你有一定的参考价值。

  • 1.关于SQL编程中的基础

  • 2.创建存储函数

    • 2.1.语法

    • 2.2举例

  • 3.存储函数的查看

  • 4.删除存储函数

  • 5.存储过程与存储函数的区别

1.关于SQL编程中的基础

  • 存储函数:封装一段SQL代码,完成一种特定的功能,然后返回结果
  • 存储过程:没有直接返回值,主要用于执行操作
  • 内置函数:数值,字符,日期和时间,聚合,流程控制,其他

2.创建存储函数

2.1.语法
CREATE FUNCTION sp_name ([func_parameter[...]])
RETURNS type
[characteristic ...] routine_body

sp_name 参数:表示存储函数的名称;
func_parameter:表示存储函数的参数列表;
RETURNS type:指定返回值的类型;
characteristic 参数:指定存储函数的特性,该参数的取值与存储过程是一样的;
routine_body 参数:表示 SQL 代码的内容,可以用 BEGIN...END 来标示 SQL 代码的开始和结束。
2.2举例

根据员工工号就能查出员工的姓名

USE employees;
DELIMITER $$
CREATE FUNCTION fun_selname(emp_no INT(15)) 
RETURNS VARCHAR(20)
BEGIN
  RETURN
  (SELECT
    first_name
  FROM
    employees WHERE employees.`emp_no`= emp_no);  
END $$
DELIMITER ;
-- 调用函数查询结果
SELECT fun_selname(10002);

3.存储函数的查看

mysqlSELECT * FROM mysql.proc WHERE db='employees' AND TYPE='function';
+-----------+-------------+----------+---------------+----------+-----------------+------------------+---------------+----------------+----------------------------+-------------------------------------------------------------------------------------------------------------+---------+---------------------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------+---------+----------------------+----------------------+-------------------+-------------------------------------------------------------------------------------------------------------+
| db        | name        | type     | specific_name | language | sql_data_access | is_deterministic | security_type | param_list     | returns                    | body                                                                                                        | definer | created             | modified            | sql_mode                                                                                                                                  | comment | character_set_client | collation_connection | db_collation      | body_utf8                                                                                                   |
+-----------+-------------+----------+---------------+----------+-----------------+------------------+---------------+----------------+----------------------------+-------------------------------------------------------------------------------------------------------------+---------+---------------------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------+---------+----------------------+----------------------+-------------------+-------------------------------------------------------------------------------------------------------------+
| employees | fun_selname | FUNCTION | fun_selname   | SQL      | CONTAINS_SQL    | NO               | DEFINER       | emp_no int(15) | varchar(20CHARSET latin1 | begin
  return
  (select
    first_name
  from
    employees where employees.`emp_no`= emp_no);  
end | root@%  | 2021-01-25 17:00:49 | 2021-01-25 17:00:49 | 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 |         | utf8                 | utf8_general_ci      | latin1_swedish_ci | begin
  return
  (select
    first_name
  from
    employees where employees.`emp_no`= emp_no);  
end |
+-----------+-------------+----------+---------------+----------+-----------------+------------------+---------------+----------------+----------------------------+-------------------------------------------------------------------------------------------------------------+---------+---------------------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------+---------+----------------------+----------------------+-------------------+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

SHOW FUNCTION STATUS WHERE NAME='fun_selname';
SHOW CREATE FUNCTION fun_selname;
SELECT * FROM information_schema.ROUTINES WHERE routine_schema='employees';

4.删除存储函数

drop function fun_selname;

5.存储过程与存储函数的区别

  • 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。存储过程,功能强大,可以执行包括修改表等一系列数据库操作;用户定义函数不能用于执行一组修改全局数据库状态的操作。
  • 对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。函数只能返回一个变量;而存储过程可以返回多个。存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类.存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。
  • 存储过程,可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
  • 存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。SQL语句中不可用存储过程,而可以使用函数。当存储过程和函数被执行的时候,SQLManager会到procedurecache中去取相应的查询语句,如果在procedure cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译.Procedure cache中保存的是执行计划 (execution plan) ,当编译好之后就执行procedure cache中的execution plan,之后SQL SERVER会根据每个executionplan的实际情况来考虑是否要在cache中保存这个plan,评判的标准一个是这个execution plan可能被使用的频率;其次是生成这个plan的代价,也就是编译的耗时。保存在cache中的plan在下次执行时就不用再编译了。


以上是关于A.004.11.Mysql 存储函数的主要内容,如果未能解决你的问题,请参考以下文章

如何优化C ++代码的以下片段 - 卷中的零交叉

如何将代码片段存储在 mongodb 中?

VSCode自定义代码片段——声明函数

使用 sqlite 的 FTS 片段函数处理 html 转义

VSCode自定义代码片段8——声明函数

sql 这些代码片段将演示如何逐步使用PolyBase。你应该有一个blob存储和存储秘密方便