自定义函数、存储过程(解释in、out和inout)和mysql中的定义变量

本文深入探讨了SQL函数和存储过程的创建与使用,详细解释了两者的语法、优点及局限性,并通过实例演示了如何在MySQL中定义和调用自定义函数与存储过程。

自定义函数

函数:是一系列sql语句的集合,他的注重点主要是返回值,可以作为查询语句的一个部分来调用,针对性强
优点:提供sql语句的重用性,共享性,可移植性,执行速度快
缺点:只能返回一个值,功能复杂,写起来更复杂,查看起来也困难

语法:

create function 函数名([参数列表]) returns 数据类型      #注意returns 要加s
begin
 sql语句;    #也可以写逻辑语句
 return;
end;

直接演示带参函数

mysql> delimiter $
mysql> create function stu_fun(name varchar(20)) returns int
    -> begin
    -> declare id int;      #定义变量,局部变量
    -> select id from stu where name=name into id;   #可以说用select into赋值变量,或者set c=1,或者set @c=1 一般set不用做select查询赋值设
    -> return id;
    -> end;
    -> $

函数调用

mysql> select stu_fun('lyf');
+----------------+
| stu_fun('lyf') |
+----------------+
|              1 |
+----------------+
mysql> select * from stu where id=stu_fun("lyf");
+----+------+------+------+
| id | name | age  | sex  |
+----+------+------+------+
|  1 | lyf  |   18 ||
+----+------+------+------+

查看函数

mysql> show create function stu_fun(函数名);

查看所有函数

mysql> show function status;  #这里会显示所有函数包含系统的一般配合like做模糊查询

删除函数

mysql> drop function stu_fun(函数名);

注意:函数只返回一个值,如果查询到多条值赋给id就会报错
ERROR 1172 (42000): Result consisted of more than one row

存储过程

存储过程:一系列sql语句的集合,与函数不同的是他没有返回值。可以作为一个独立的部分来执行, 他比函数更强大,他可以修改一系列表。能批量操作
优点:可重用性,对开发者透明,减少sql冗余,也可以安全封装,只显示应该显示的
缺点:开发、维护、调试是困难,复杂业务难以构造,过多的存储过程会加大内存

语法;

create procedure 存储过程名([参数列表])     #参数中in表示输入、out表示输出、inout表示可以输入可以输出
begin 
    sql语句或者逻辑语句
end;  

例子,一次性举例三种参数传递

mysql> create procedure stu_proce(in name varchar(20),out ages int,inout sex varchar(2))
    -> begin
    -> select * from stu where name=name and sex=sex;
    -> select age into ages from stu where name=name and sex=sex;
    -> end;
    -> $
Query OK, 0 rows affected (0.00 sec)

使用存储过程并设置参数:

mysql> delimiter ;
mysql> set @sex='男';      #一个@表示用户变量,两个@表示系统会话变量(最后会说明),inout需要先设置值之后在传参
Query OK, 0 rows affected (0.00 sec)

#out输出变量也需要用用户变量传出来
mysql> call stu_proce('lyf',@ages,@sex);
+----+------+------+------+
| id | name | age  | sex  |
+----+------+------+------+
|  1 | lyf  |   18 ||
+----+------+------+------+
1 row in set (0.00 sec)
Query OK, 1 row affected (0.01 sec)
#这里输出了那条select查询语句


mysql> select @ages,@sex;
+------+------+
| @ages| @sex |
+------+------+
|  18  ||
+------+------+
1 row in set (0.00 sec)     
#注意这里要用ages不能age是因为如果用age就会同名,输出结果会是Null,
#多个赋值可以用select age,name into ages,names from stu where id=1;       

查看存储过程

mysql> show create procedure stu_proce(存储过程名);

查看所有存储过程

mysql> show procedure status;  #这里会显示所有函数包含系统的一般配合like做模糊查询

删除存储过程

mysql> drop procedure stu_proce;
对于in、out、inout作用范围:
mysql> delimiter $
mysql> create procedure proce(in p_in int,out p_out int,inout p_inout int)
    -> begin
    -> select p_in,p_out,p_inout;
    -> set p_in=2,p_out=2,p_inout=2;
    -> select p_in,p_out,p_inout;
    -> end;
    -> $
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> set @p_in=1,@p_out=1,@p_inout=1;
Query OK, 0 rows affected (0.00 sec)

mysql> call proce(@p_in,@p_out,@p_inout);
+------+-------+---------+
| p_in | p_out | p_inout |
+------+-------+---------+
|    1 |  NULL |       1 |
+------+-------+---------+
1 row in set (0.00 sec)

+------+-------+---------+
| p_in | p_out | p_inout |
+------+-------+---------+
|    2 |     2 |       2 |
+------+-------+---------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> select @p_in,@p_out,@p_inout;
+-------+-------+----------+
| @p_in | @p_out| @p_inout |
+-------+-------+----------+
|     1 |     2 |        2 |
+-------+-------+----------+
1 row in set (0.00 sec)

p_in 在存储过程中被修改,但并不影响 @p_id 的值
p_out为null因为out是向调用者输出参数,不接收输入的参数。调用后,输出参数,改变了p_out变量的值
p_inout,在调用了存储过程后,接受了输入的参数,也输出参数,改变了变量
这一部分开始我也不懂,我看了下w3的文档然后实践操作了一下

mysql中的变量定义

    用户自定义变量:
            declare id int default 局部变量定义在begin ... end中
            set @id=1  用户变量  只要写上@id(写id不算)他在这个窗口都有效,都可以使用(包括在函数、触发器中)
    系统变量:用于改变系统参数的
            set @@id=1 会话变量             #这个修改只会改变这个窗口,其他窗口会改变
            set globe @@id=1 全局变量   #这个则只改变这次服务的开启,重启服务后又会重置
            永久改变系统参数配置,需要修改配置文件
   查询全局变量:show global variables;
   查询会话变量:show session variables;或show variables;
<think>嗯,用户想知道如何在MySQL自定义函数定义count变量并与传入参数比较。首先,我需要回忆一下MySQL自定义函数的基本结构。根据引用[3],函数体必须有return语句,而且每个SQL语句后面要用分号结尾,所以可能需要用delimiter来改变结束符。 然后是变量定义MySQL中在函数定义变量应该使用DECLARE关键字,对吧?比如DECLARE count INT DEFAULT 0;这样就能声明一个整型变量count,初始值为0。接下来,用户可能需要给这个变量赋值,可以用SET语句,或者通过SELECT...INTO的方式。比如SET count = 10;或者SELECT COUNT(*) INTO count FROM table;这样。 接下来是比较传入的参数。假设函数有一个输入参数param,那么比较的时候直接用IF语句,比如IF count > param THEN ... END IF;。不过需要注意变量的作用域名称是否冲突,比如参数名变量名不能重复。 用户可能还需要一个示例,所以得构造一个简单的例子。比如函数接收一个参数min_count,然后计算某个表中的记录数,如果大于min_count就返回1,否则返回0。这样的话,函数的结构应该是先声明变量,查询赋值,然后比较,最后返回结果。 另外,根据引用[1],参数类型有INOUTINOUT,但用户的问题里只提到了输入参数,所以函数应该用IN参数。同时,引用[4]提到自定义函数可以有多个参数,用逗号分隔,但这里用户只需要一个传入参数来比较。 还需要注意,函数必须用RETURN返回,而存储过程OUT参数。所以这里肯定是用RETURN语句。另外,分隔符的问题,创建函数之前要用DELIMITER $$来改变结束符,避免分号冲突。 可能用户遇到的错误包括变量声明的位置不对,比如必须在函数体开始处声明变量,或者在后续逻辑中使用了未声明的变量。还有比较的时候语法错误,比如缺少THEN或者END IF。 最后,需要确保语法正确,比如变量名不要列名冲突,使用正确的语句结构。检查示例中的每一步是否正确,特别是DECLARE的位置IF的条件判断是否正确。</think>### 在 MySQL 自定义函数定义变量并与参数比较的方法 #### 1. **定义变量的语法** 在 MySQL 自定义函数中,变量需通过 `DECLARE` 关键字声明,格式为: $$ DECLARE \变量名\ 数据类型 [DEFAULT 默认值]; $$ 例如,定义 `count` 变量并初始化为 0: ```sql DECLARE count INT DEFAULT 0; ``` #### 2. **变量赋值与参数比较** - **赋值方式**:使用 `SET` 或 `SELECT...INTO` ```sql SET count = 10; -- 直接赋值 SELECT COUNT(*) INTO count FROM 表名; -- 通过查询结果赋值 ``` - **与传入参数比较**:使用 `IF` 条件语句 ```sql IF count > 输入参数 THEN -- 执行逻辑 END IF; ``` #### 3. **完整示例** 以下示例函数接收参数 `min_count`,统计某表记录数并与参数比较: ```sql DELIMITER $$ CREATE FUNCTION check_count(min_count INT) RETURNS INT BEGIN DECLARE count INT DEFAULT 0; SELECT COUNT(*) INTO count FROM 表名; IF count > min_count THEN RETURN 1; ELSE RETURN 0; END IF; END$$ DELIMITER ; ``` **说明**: - 使用 `DELIMITER $$` 避免分号冲突[^3]; - 参数 `min_count` 为 `IN` 类型(默认类型)[^1]; - 变量作用域仅限于函数体内部。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值