mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin...end
块中使用,变量必须定义在复合语句的开头,并且是在其它语句之前,也可以同时申明多个变量,如果需要,可以使用default赋默认值。
定义一个变量语法如下:
declare
var_name[,...]
type[default
value]看一个变量定义实例
declare
last
date二、mysql存储过程变量赋值
变量的赋值可直接赋值与查询赋值来 *** 作,直接赋值可以用set来 *** 作,可以是常量或表达式如果下
复制代码
代码如下:
set
var_name=
[,var_name
expr]...给上面的last变量赋值方法如下
set
last
=
date_sub(
current_date(),interval
1
month)下面看通过查询给变量赋值,要求查询返回的结果必须为一行,具体 *** 作如下
select
col
into
var_name[,...]
table_expr我们来通过查询给v_pay赋值。
create
function
get
_cost(p_custid
int,p_eff
datetime)
return
decimal(5,2)
deterministic
reads
sql
data
begin
declare
v_pay
decimail(5,2)
select
ifnull(
sum(pay.amount),0)
into
vpay
from
payment
where
pay.payd<=p_eff
and
pay.custid=pid
reutrn
v_rent
+
v_over
-
v_pay
end
$$
好了,这篇简单的存储过程中变量的定义赋值教程就到这里了,下面我们会接着讲关于myql存储过程的条件的定义与处理。
以下是其它网友的补充
在MySQL的存储过程中,可以使用变量,它用于保存处理过程中的值。
定义变量使用DECLARE语句,语法格式如下:
DECLARE
var_name[,...]
type
[DEFAULT
value]
其中,var_name为变量名称,type为MySQL支持的任何数据类型,可选项[DEFAULT
value]为变量指定默认值。一次可以定义多个同类型的变量,各变量名称之间以逗号“,”隔开。
定义与使用变量时需要注意以下几点:
◆
DECLARE语句必须用在DEGIN…END语句块中,并且必须出现在DEGIN…END语句块的最前面,即出现在其他语句之前。
◆
DECLARE定义的变量的作用范围仅限于DECLARE语句所在的DEGIN…END块内及嵌套在该块内的其他DEGIN…END块。
◆
存储过程中的变量名不区分大小写。
定义后的变量采用SET语句进行赋值,语法格式如下:
SET
var_name
=
expr
[,var_name
=
expr]
...
其中,var_name为变量名,expr为值或者返回值的表达式,可以使任何MySQL支持的返回值的表达式。一次可以为多个变量赋值,多个“变量名=值”对之间以逗号“,”隔开。
例如:
复制代码
代码如下:
begin
declare
no
varchar(20)
declare
title
varchar(30)
set
no='101010',title='存储过程中定义变量与赋值'
end
提示:存储过程中所有的关键字也是不区分大小写的,如BEGIN可以写出begin。
1 mysql 的存储过程里,没有固定的输出语句,要输出内容,使用 select .. 形式即可;select var_a
select column_a from tb_a limit 2
2 存储过程里,如果只是输出内容(不进行捕获),用上边1中的select即可;如果调用存储过程后对输出的值进行后续捕获,则需使用 out 指定输出参数;
3 @var_a 表示这是个会话变量,在存储过程里可以直接设置值而不用声明,如
set @var_a = 10
但并不推荐在存储过程里使用会话变量(因为这种变量在同一个mysql连接是都是生效的,执行完存储后仍存在),推荐使用声明式的临时变量,即以下方式:
declare var_a int
set var_a = 10
4 示例
drop PROCEDURE p_a
create PROCEDURE p_a(out aa int)
begin
declare bb int
set bb = 10
select bb
select * from t_student limit 1
select CURRENT_DATE()
set aa = bb
end
#调用
set @temp = 50
call p_a(@temp)
select @temp #@temp 为会话变量,由存储过程返回重设值了。
希望能解决您的问题。
mysql中各种类型变量的定义以及赋值使用
MySQL中实现rank排名查询
# 1、局部变量(即@开头的变量)
在一个会话内,只须初始化一次,之后在会话内都是对 上一次计算的结果 ,就相当于在是这个会话内的全局变量。
mysql中局部变量不用事前申明,在用的时候直接用“@变量名”使用就可以了。
# 2、语法
初始值赋值 :
使用
注意:
使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值”
如果直接写:select @name:=password from user
如果这个查询返回多个值的话,那@name变量的值就是最后一条记录的password字段的值 。
题目1:根据学生的年年龄进行排序,相同年龄的学生为一组,组内编号依次为1,2,3...
实现:一个字段内部的排序。
MySQL中row_number的实现
通常,用group by 可以实现一个字段的聚合,再结合order by进行排序。但是在一个字段内部不同的'值'再聚合并排序,就不是group by能够做到的了。
此处可以使用局部变量实现自增,给字段内不同value 使用case...when...进行条件判断后打上标签,也就实现了排序功能。
使用
具体运行过程成:
另一种用户变量的初始赋值技巧:
得到相同的运行结果
题目2:按各科成绩进行排序,并显示排名, Score 重复时也继续排名
set @i:=0,@j:=null
select sid,cid,@i:=if(@i=@j,@i,@i+1) as stu_rank,@j:=score as stu_score
from sc
order by stu_score desc
方法一:case ...when...
另一种初始赋值形式也可以写成:
运行结果:
方法二:if(exp1,exp2,exp3)
另一种初始赋值形式也可以写成:
运行结果:
题目中的要求要简单些,不需要判断是否与上一行相等,一直继续排序即可。相当于根据成绩排名后添加行号。
运行结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)