Mysql数据库 存储过程和存储函数

本文详细介绍了MySQL数据库中的存储过程和存储函数,包括它们的创建、参数类型、特性以及调用方式。此外,还讲解了如何使用DELIMITER命令更改命令结束符,以及DECLARE和SET语句声明及赋值局部变量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储过程:

存储过程是一组为了完成特定的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数来调用执行它。

创建存储过程的关键字: PROCEDURE

格式:CREATE PROCEDURE  sp_name (proc_parameter[,...])

                         [characteristic] routin_body

其中,sp_name参数是存储过程的名字;proc_parameter表示存储过程的参数列表;characteristic参数指定存储过程的特性;routine_body参数是SQL代码的内容,可以用begin....end来标识SQL代码的开始和结束。

proc_parameter中的每个参数由3部分组成。分别是:输入,输出类型、参数名称、和参数类型。

输入参数用IN表示,输出参数用OUT表示,INOUT表示即可输入也可输出。

characteristic参数的说明:

language SQL: 说明routine_body部分是由SQL语言的语句组成,这也是数据库系统默认的语言。

[not] deteministic :指明存储过程中的执行结果是否确定。deteministic表示结果是确定的,每次执行存储时,相同的输入会得到相同的输出。not deterministic 表示结果是非确定的,相同的输入可能得到不同的输出。在默认情况下,结果都是非确定的。

{contains SQL | no SQL |  reads SQL data | modifies SQL data} :指明程序使用SQL语句的限制。cintains SQL 表示子程序包含SQL语句,但不包含读或者写的语句.。 no SQL 表示子程序中不包含SQL语句;reads SQL data 表示子程序中包含读数据的语句; modifies SQL data表示子程序中包含写数据的语句。在默认情况下,系统会指定为cintains SQL。

SQL security{definer|invoker}:指明谁有权来执行。definer 表示只有定义者自己才能够执行;Invoker 表示调用者才可以执行。在默认情况下,系统指定的权限是definer。

调用存储过程的语法格式如下:

CALL sp_name ([parameter[,...]])

存储函数的创建:

语法格式:

CREATE FUNCTION sp_name ([func_parameter[,....]])

RETURNS type

[characteristic...] routine_body

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

调用存储函数语法格式如下:

SELECT sp_name ([func_parameter[,....]])

DELIMITER命令

在MySQL命令行的客户端中,服务器处理语句默认是以分号(;)作为结束标志的,如果有一行命令以分号结束,那么按【enter】键后,MySQL将会执行该命令。但在存储过程中,可能输入较多的语句,且语句中含分号。如果还以分号作为结束标志,那么,我们可以用MySQL DELIMITER来改变默认的结束标志。

DELIMITER格式语法为:

                DELIMITER  $ $

其中,$$是用户定义的结束符,通常使用一些特殊字符发的符号。当使用DELIMITER命令时,应该避免使用反斜杠\字符,因为那是MySQL的转义字符。

变量:

(1)DECLARE语句申明局部变量。

注意:DECLARE 语句申明局部的变量只适用于BEGIN....ENG之间。

语法格式:

DECLARE var_name[,var_name2]...type [default vaule]

type参数用来指明变量的类型,default vaule 字句将变量默认值设置为vaule,没有使用default字句,默认是null

(2)用SET语句来给变量赋值。

格式: 

SET     var_name= exper[,var_name= exper]

DECLARE 定义的变量作用范围是BEGIN....ENDZ块内,只能在块中使用。SET定义的变量为用户变量。在定义变量时,变量名称前使用@修饰。如SET @ var =12;

(3)使用SELECT  语句给变量赋值。

SELECT  clo_name[,...] INTO var_name [,...] table_expr

其中col_name是列名,var_name是要赋值的变量名称,table_expr是select语句中的from字句后面的部分。

下面是实例代码:

-- 存储过程	
DELIMITER &&
		CREATE PROCEDURE teacherinfo1(IN teacherid FLOAT, IN type FLOAT,OUT info VARCHAR(20)) 
		READS SQL DATA
		BEGIN
	  CASE  type
	     WHEN 1 THEN
	         SELECT namea INTO info FROM teacherinfo WHERE  num = teacherid;
			 WHEN 2 THEN
					 SELECT YEAR(NOW())-YEAR(Birthday) INTO info FROM teacherinfo WHERE num = teacherid;
			 ELSE
					SELECT 'Error' into info ;
		END CASE;
	END &&
	DELIMITER 

-- (存储函数)

	DELIMITER &&
	CREATE FUNCTION Pfood_price_count1(price_info1 FLOAT, price_info2 FLOAT)
	  RETURNS INT READS SQL DATA 
		   BEGIN 
			   RETURN (SELECT COUNT(*) FROM food WHERE price>price_info1 AND price <price_info2);
	END &&
DELIMITER ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值