mysql存储过程和函数的使用_mysql中存储过程和存储函数是什么?

news/2024/7/4 8:48:23

在mysql中,存储过程和存储函数都是数据库中定义的一些SQL语句的集合。其中,存储函数可以通过return语句返回函数值,主要用于计算并返回一个值;而存储过程没有直接返回值,主要用于执行操作。

253c31713156c3031ae366509ae8c59a.png

(推荐教程:mysql视频教程)

mysql中的存储过程

编写存储过程并不是件简单的事情,但是使用存储过程可以简化操作,且减少冗余的操作步骤,同时,还可以减少操作过程中的失误,提高效率,因此应该尽可能的学会使用存储过程。

下面主要介绍如何创建存储过程。

可以使用 CREATE PROCEDURE 语句创建存储过程,语法格式如下:CREATE PROCEDURE ( [过程参数[,…] ] )

[过程参数[,…] ] 格式[ IN | OUT | INOUT ]

语法说明如下:

1) 过程名

存储过程的名称,默认在当前数据库中创建。若需要在特定数据库中创建存储过程,则要在名称前面加上数据库的名称,即 db_name.sp_name。

需要注意的是,名称应当尽量避免选取与 MySQL 内置函数相同的名称,否则会发生错误。

2) 过程参数

存储过程的参数列表。其中,为参数名,为参数的类型(可以是任何有效的 MySQL 数据类型)。当有多个参数时,参数列表中彼此间用逗号分隔。存储过程可以没有参数(此时存储过程的名称后仍需加上一对括号),也可以有 1 个或多个参数。

MySQL 存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT 三个关键字标识。其中,输入参数可以传递给一个存储过程,输出参数用于存储过程需要返回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。

需要注意的是,参数的取名不要与数据表的列名相同,否则尽管不会返回出错信息,但是存储过程的 SQL 语句会将参数名看作列名,从而引发不可预知的结果。

3) 过程体

存储过程的主体部分,也称为存储过程体,包含在过程调用的时候必须执行的 SQL 语句。这个部分以关键字 BEGIN 开始,以关键字 END 结束。若存储过程体中只有一条 SQL 语句,则可以省略 BEGIN-END 标志。

在存储过程的创建中,经常会用到一个十分重要的 MySQL 命令,即 DELIMITER 命令,特别是对于通过命令行的方式来操作 MySQL 数据库的使用者,更是要学会使用该命令。

在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句,这样显然不行。

为解决以上问题,通常使用 DELIMITER 命令将结束命令修改为其他字符。语法格式如下:DELIMITER $$

语法说明如下:$$ 是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“?”或两个“¥”等。

当使用 DELIMITER 命令时,应该避免使用反斜杠“\”字符,因为它是 MySQL 的转义字符。

在 MySQL 命令行客户端输入如下 SQL 语句。mysql > DELIMITER ??

成功执行这条 SQL 语句后,任何命令、语句或程序的结束标志就换为两个问号“??”了。

若希望换回默认的分号“;”作为结束标志,则在 MySQL 命令行客户端输入下列语句即可:mysql > DELIMITER ;

注意:DELIMITER 和分号“;”之间一定要有一个空格。在创建存储过程时,必须具有 CREATE ROUTINE 权限。

mysql中的存储函数

在 MySQL 中,使用 CREATE FUNCTION 语句来创建存储函数,其语法形式如下:CREATE FUNCTION sp_name ([func_parameter[...]])

RETURNS type

[characteristic ...] routine_body

其中:sp_name 参数:表示存储函数的名称;

func_parameter:表示存储函数的参数列表;

RETURNS type:指定返回值的类型;

characteristic 参数:指定存储函数的特性,该参数的取值与存储过程是一样的;

routine_body 参数:表示 SQL 代码的内容,可以用 BEGIN...END 来标示 SQL 代码的开始和结束。

注意:在具体创建函数时,函数名不能与已经存在的函数名重名。除了上述要求外,推荐函数名命名(标识符)为 function_xxx 或者 func_xxx。func_parameter 可以由多个参数组成,其中每个参数由参数名称和参数类型组成,其形式如下:

[IN | OUT | INOUT] param_name type;

其中:IN 表示输入参数,OUT 表示输出参数,INOUT 表示既可以输入也可以输出;

param_name 参数是存储函数的参数名称;

type 参数指定存储函数的参数类型,该类型可以是 MySQL 数据库的任意数据类型。

例 1

使用 CREATE FUNCTION 创建查询 tb_student 表中某个学生姓名的函数,SQL 语句和执行过程如下:mysql> USE test;

Database changed

mysql> DELIMITER //

mysql> CREATE FUNCTION func_student(id INT(11))

-> RETURNS VARCHAR(20)

-> COMMENT '查询某个学生的姓名'

-> BEGIN

-> RETURN(SELECT name FROM tb_student WHERE tb_student.id = id);

-> END //

Query OK, 0 rows affected (0.10 sec)

mysql> DELIMITER ;

上述代码中,创建了 func_student 函数,该函数拥有一个类型为 INT(11) 的参数 id,返回值为 VARCHAR(20) 类型。SELECT 语句从 tb_student 表中查询 id 字段值等于所传入参数 id 值的记录,同时返回该条记录的 name 字段值。

创建函数与创建存储过程一样,需要通过命令 DELIMITER // 将 SQL 语句的结束符由“;”修改为“//”,最后通过命令 DELIMITER ; 将结束符号修改成 SQL 语句中默认的结束符号。

如果在存储函数中的 RETURN 语句返回一个类型不同于函数的 RETURNS 子句中指定类型的值,返回值将被强制为恰当的类型。比如,如果一个函数返回一个 ENUM 或 SET 值,但是 RETURN 语句返回一个整数,对于 SET 成员集的相应的 ENUM 成员,从函数返回的值是字符串。

拓展阅读

由于存储函数和存储过程的查看、修改、删除等操作几乎相同,所以我们不再详细讲解如何操作存储函数了。

查看存储函数的语法如下:SHOW FUNCTION STATUS LIKE 存储函数名;

SHOW CREATE FUNCTION 存储函数名;

SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=存储函数名;

可以发现,操作存储函数和操作存储过程不同的是将 PROCEDURE 替换成了 FUNCTION。同样,修改存储函数的语法如下:ALTER FUNCTION 存储函数名 [ 特征 ... ]

存储函数的特征与存储过程的基本一样。


http://www.niftyadmin.cn/n/1997380.html

相关文章

技校可以学php吗,上技校学技术,该选什么专业好就业?

俗话说:“男怕入错行,女怕嫁错郎”,正因为如此,这句话也从另一方面激励着每一个有志青年为了自己的人生更加精彩而不懈奋斗。越来越多的青年选择上技校学技术,那么,上技校如何选专业呢?做到“入…

MFC应用程序中指针的获取(1)

MFC应用程序中指针的使用 1) 在View中获得Doc指针 2) 在App中获得MainFrame指针 3) 在View中获得MainFrame指针 4) 获得View(已建立)指针 5) 获得当前文档指针 6) 获得状态栏与工具栏指…

python中的start_在scrapy框架python的start_urls列表中为url构造...

我对Scrapy非常陌生,而且之前我没有使用过正则表达式以下是我的spider.py代码class ExampleSpider(BaseSpider):name "test_codeallowed_domains ["www.example.com"]start_urls ["http://www.example.com/bookstore/new/1?filterbookstore",&quo…

matlab画出积分波形,matlab课程设计参考题目

课题一:连续时间信号和系统时域分析及MATLAB实现课题要求:深入研究连续时间信号和系统时域分析的理论知识。利用MATLAB虽大的图形处理功能、符号运算功能以及数值计算功能,实现连续时间信号和系统时域分析的仿真波形。课题内容:一…

全程干货!中国商标注册全流程,注册中国商标操作指南

只有注册了商标的商品,能够进入商场、超市、电商平台销售。商标利于消费者记忆,防止被仿造。注册商标受法律保护,享有专用权,其他任何人均不能再相同或近似商品上使用。中国商标是企业的无形财产,可授权、转卖、加入资…

在MFC类中各种类的指针的获取和应用 (2)

关于MFC下的文档和视图以及框架之间的访问, 这些问题已经是老生常谈了,但我觉得还是都没有详细的说明,特    别是对于英语较差的人,我查看了一些blog,总结了一下!希望对和我一样的人有点帮助!    1:  因为对于SDI程序,主框架窗口就是文档框窗(如果这个也不…

零元学Expression Design 4 - Chapter 3 看小光被包围了!!如何活用「Text On Path」设计效果...

原文:零元学Expression Design 4 - Chapter 3 看小光被包围了!!如何活用「Text On Path」设计效果本章将教大家如何活用「Text On Path」,做出文绕图以及文字线性排列的效果 也可以学到如何使用Polyline以及B-Spline ? 本章将教大家如何活用「Text On Path」&#…

关于CString

关于CString 通过阅读本文你可以学习如何有效地使用 CString。  CString 是一种很有用的数据类型。它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多。不管怎样,使用CString有很多特殊的技巧,特别是对于纯C背景…