-
2021-01-18 23:12:35
# 使用的navicat 编辑的存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_student_back`()
BEGIN
#定义max变量
DECLARE max INT DEFAULT 0;
select max(id) into max from student_back;
#判断是不是空值 是空值就赋值为0
if max is null then
set max = 0;
end if;
#备份数据
INSERT INTO student_back () SELECT * from student where id > max limit 10;
select max(id) into max from student_register_back;
#返回值
select max;
END
#结束
其他方法:
-- 方式 1
DECLARE cnt INT DEFAULT 0;
select count(*) into cnt from test_tbl;
select cnt;
-- 方式 2
set @cnt = (select count(*) from test_tbl);
select @cnt;
-- 方式 3
select count(*) into @cnt1 from test_tbl;
select @cnt1;
-- 多个列的情况下似乎只能用 into 方式
select max(status), avg(status) into @max, @avg from test_tbl;
select @max, @avg;
更多相关内容 -
mysql 存储过程中变量的定义与赋值操作
2020-12-15 15:49:39一、变量的定义 mysql中变量定义用declare来定义...二、mysql存储过程变量赋值 变量的赋值可直接赋值与查询赋值来操作,直接赋值可以用set来操作,可以是常量或表达式如果下 代码如下: set var_name= [,var_name expr] -
自习系列—MySQL存储过程之变量赋值
2020-07-09 01:02:29MySQL变量赋值就一个坑。这个坑有两种填法。 第一种是众所周知的:set 变量名=值/赋值语句 第二种是:select … set 变量名 …; 或者 select … set 变量名; 第一种,我在网上看很多人说变量名前面要加@符合,但是...MySQL变量赋值就一个坑。这个坑有两种填法。
第一种是众所周知的:set 变量名=值/赋值语句
第二种是:select … into 变量名 …; 或者 select … into 变量名;第一种,我在网上看很多人说变量名前面要加@符合,但是实际上是不必要的,只有一些特殊情况是必须要@符合,大部分时候不加也不影响存储过程的使用的。
例如:set g_grant_ex='gamedb.tb_exchange_'; set @g_grant_ex='gamedb.tb_exchange_'; /*这其实是一样的效果*/
第二种,这个就更坑了。我之前看别人用的是云里雾里。后来动手试了几次才发现。。。。。。。蛮好用的~例子如下
列如:1.select count(*) into g_err from information_schema.TABLES t where t.TABLE_SCHEMA='gamedb' and t.TABLE_NAME=concat('tb_recharge_',g_year); 2.select count(*) from information_schema.TABLES t where t.TABLE_SCHEMA='gamedb' and t.TABLE_NAME=concat('tb_recharge_',g_year) into g_err; /*这两个效果也是一样的*/
-
mysql 存储过程 declared局部变量 赋值失败问题(不循环)
2021-01-26 04:30:301.今天发现用游标建立的存储过程不循环,找了很长时间终于知道原因了解决:1.数据库字段类型是 decimal存储过程 declared 字段类型 也是decimal确定没问题2.declared 字段类型 后 定义默认值的时候,应加上小数位数。...1.今天发现用游标建立的存储过程不循环,找了很长时间终于知道原因了
解决:
1.
数据库字段类型是 decimal
存储过程 declared 字段类型 也是decimal
确定没问题
2.
declared 字段类型 后 定义默认值的时候,应加上小数位数。
比如数据库字段 小数位数是4位数 , 设置默认值就应该这么样(例:default 0.0000)
3.如果前两步没问题,就来看看赋值问题
我用的是into 局部变量赋值的方式,这里有个问题 赋值的时候局部变量名字不能于字段名重复.
为了赋值方便 我使用了set 赋值方式
代码如下:
BEGIN
-- 局部变量的定义 declare
DECLARE meter_id BIGINT DEFAULT 0;-- 设备id
DECLARE flow_now DECIMAL(18,4) DEFAULT 0.0000;-- 当天用电量
DECLARE flow_before DECIMAL(18,4) DEFAULT 0.0000;-- 前一天用电量
DECLARE build_id INT DEFAULT 0;-- 建筑id
DECLARE room_id INT DEFAULT 0;-- 房间id
DECLARE done INT DEFAULT 0; -- 控制游标结束
DECLARE cur_meter CURSOR FOR
SELECT energy.meter_info.hid ,energy.meter_info.buildid,energy.meter_info.consumer_id
FROM energy.meter_info where 1=1 AND energy.meter_info.meter_type='6';-- 声明游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;-- 控制游标的结束
-- DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;-- 这把 游标 异常后 捕捉 并设置 循环使用 变量 id 为 null 跳出循环(控制游标结束与上一句一样)
OPEN cur_meter;-- 开启游标
REPEAT -- repeat循环
FETCH cur_meter INTO meter_id,build_id,room_id;-- 把第一行记录写入变量里,游标也随着指向第一行
IF NOT done THEN -- 判断循环是否结束
-- 取当天的用电量
SET flow_now = (SELECT energy.electric_data.elec
FROM energy.electric_data
WHERE 1=1 and date(energy.electric_data.sys_read_time) = curdate() and energy.electric_data.meter_id = meter_id);
-- 取昨天用电量
SET flow_before = (SELECT energy.electric_data.elec
FROM energy.electric_data
WHERE 1=1 and date(energy.electric_data.sys_read_time) = curdate()-1 and energy.electric_data.meter_id = meter_id);
IF flow_now-flow_before > 0 THEN
-- 插入到电表统计表中
INSERT INTO energy.electric_data_total(energy.electric_data_total.meter_id,energy.electric_data_total.build_id,
energy.electric_data_total.room_id,energy.electric_data_total.electric_flow,
energy.electric_data_total.create_date,energy.electric_data_total.create_user)
VALUES(meter_id,build_id,room_id,flow_now-flow_before,date(NOW()),'admin');
END IF;
END IF;
UNTIL done END REPEAT; -- repeat循环结束
CLOSE cur_meter;-- 注意,用完后必须关闭
END
另一种方式是给其加上函数 然后再赋值
代码如下
BEGIN
-- 局部变量的定义 declare
DECLARE meter_id BIGINT DEFAULT 0;-- 设备id
DECLARE flow_now DECIMAL(18,4) DEFAULT 0.0000;-- 当天用电量
DECLARE flow_before DECIMAL(18,4) DEFAULT 0.0000;-- 前一天用电量
DECLARE build_id INT DEFAULT 0;-- 建筑id
DECLARE room_id INT DEFAULT 0;-- 房间id
DECLARE done INT DEFAULT 0; -- 控制游标结束
DECLARE cur_meter CURSOR FOR
SELECT energy.meter_info.hid ,energy.meter_info.buildid,energy.meter_info.consumer_id
FROM energy.meter_info where 1=1 AND energy.meter_info.meter_type='6';-- 声明游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;-- 控制游标的结束
-- DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;-- 这把 游标 异常后 捕捉 并设置 循环使用 变量 id 为 null 跳出循环(控制游标结束与上一句一样)
OPEN cur_meter;-- 开启游标
REPEAT -- repeat循环
FETCH cur_meter INTO meter_id,build_id,room_id;-- 把第一行记录写入变量里,游标也随着指向第一行
IF NOT done THEN -- 判断循环是否结束
-- 取当天的用电量
SELECT max(energy.electric_data.elec) INTO flow_now
FROM energy.electric_data
WHERE 1=1 and date(energy.electric_data.sys_read_time) = curdate() and energy.electric_data.meter_id = meter_id;
-- 取昨天用电量
SELECT max(energy.electric_data.elec) INTO flow_before
FROM energy.electric_data
WHERE 1=1 and date(energy.electric_data.sys_read_time) = curdate()-1 and energy.electric_data.meter_id = meter_id;
IF flow_now-flow_before > 0 THEN
-- 插入到电表统计表中
INSERT INTO energy.electric_data_total(energy.electric_data_total.meter_id,energy.electric_data_total.build_id,
energy.electric_data_total.room_id,energy.electric_data_total.electric_flow,
energy.electric_data_total.create_date,energy.electric_data_total.create_user)
VALUES(meter_id,build_id,room_id,flow_now-flow_before,date(NOW()),'admin');
END IF;
END IF;
UNTIL done END REPEAT; -- repeat循环结束
CLOSE cur_meter;-- 注意,用完后必须关闭
END
-
MySQL存储过程如何进行变量的定义和赋值
2021-02-08 07:00:01昨天我们讲了mysql存储过程创建修改与删除,下面我们这篇教程是讲关于mysql存储过程中变量的定义赋值操作哦。一、变量的定义 mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin...end块中使用...昨天我们讲了mysql存储过程创建修改与删除,下面我们这篇教程是讲关于mysql存储过程中变量的定义赋值操作哦。
一、变量的定义 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
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。
-
MySQL 声明变量及存储过程分析
2021-01-21 14:59:34直接将表内内容赋值到指定变量当中 select name,bid into @a,@b from bank limit 1; 要注意一点就是变量名不能和字段名一致 存储过程 存储过程将一段通用的操作封装在一起 这样再不同平台都可以公用了 储存... -
mysql存储过程多个变量赋值
2021-01-19 02:22:36"云数据库RDS MySQL版","des":"云数据库RDS MySQL版 MySQL 是全球最受欢迎的开源数据库,阿里云MySQL版 通过深度的内核优化和独享实例提供稳定极致的数据库性能,同时灵活的部署架构及产品形态,可满足不同场景下的... -
mysql存储过程空值赋值变量的问题
2019-09-03 16:06:29mysql的存储过程,在赋值变量时,如果所赋值为空,则赋值失败,变量维持现状。 比如: my_loop : LOOP IF(逻辑判断) TEHN leave my_loop; END IF; select id into my_id from user limit 1; END LOOP; 假设第一... -
mysql存储过程多条记录赋值给变量
2021-01-19 12:57:50"云数据库RDS MySQL版","des":"云数据库RDS MySQL版 MySQL 是全球最受欢迎的开源数据库,阿里云MySQL版 通过深度的内核优化和独享实例提供稳定极致的数据库性能,同时灵活的部署架构及产品形态,可满足不同场景下的... -
MySQL存储过程中使用SELECT …INTO语句为变量赋值
2021-01-18 19:27:44使用SELECT …INTO语句为变量赋值在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下:SELECTcol_name[,...]... -
检查MySQL存储过程中的NULL或空变量
2021-01-27 20:45:46让我们创建一个存储过程-delimiter//createprocedurecheckingForNullDemo(Namevarchar(20))beginifNameisNULLORName=''thenselect'AdamSmith';elseselectName;endif;end//delimiter;情况1传递N... -
mysql存储过程查询赋值解决思路
2021-02-07 06:46:54mysql存储过程查询赋值数据库:mysql表1:CREATE TABLE t_test1 (test1 varchar(100) COLLATE utf8_bin DEFAULT NULL,test2 varchar(100) COLLATE utf8_bin DEFAULT NULL)表2:CREATE TABLE test2 (test varchar(100... -
mysql存储过程使用select ... into语句为变量赋值范例
2021-01-26 21:04:37本文为大家介绍mysql存储过程使用select ... into语句为变量赋值的范例,感兴趣的朋友可以参考下。在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给... -
mysql存储过程:定义变量,赋值,判断,输出
2021-01-27 21:33:281.定义变量,赋值,... -- 如果proc_first存在就删除create procedure proc_first()-- 创建存储过程begin-- 定义变量DECLARE age INT;-- 赋值set age = 23;select age;end;-- 执行call proc_first;1.定义变量,赋... -
MySQL存储过程和方法之变量赋值
2013-12-15 20:24:04在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量。SELECT …INTO语句的语法格式如下: SELECT col[,...] INTO var[,...] table col... -
MySQL_mysql 存储过程中变量的定义与赋值操作,一、变量的定义 mysql中变量定 - phpStudy
2021-01-19 08:28:19mysql 存储过程中变量的定义与赋值操作一、变量的定义mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin...end 块中使用,变量必须定义在复合语句的开头,并且是在其它语句之前,也可以同时... -
MySQL存储过程select中为变量赋值
2015-12-29 13:48:47[color=red]注:查询可以使用游标获取单个或一组数据,但有时候返回值就只有一个,那么我们通常使用查询(SELECT ...INTO ...FROM )赋值方法.[/color] 原始SQL语句: [code="sql"] DROP PROCEDURE IF ... -
mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法
2020-09-08 23:27:52主要介绍了mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法,结合实例形式较为详细的分析了mysql存储过程创建、调用及变量创建、赋值具体原理、操作技巧与相关... -
存储过程中MySQL变量定义和赋值
2021-01-18 23:22:30MySQL变量定义和赋值是我们经常会遇到的问题,下面就为您接受如何在存储过程中MySQL变量定义和赋值,希望对您学习MySQL变量定义方面能有所启迪。一、MySQL变量的定义mysql变量定义用declare来定义一局部变量,mysql ... -
mysql存储过程 在动态SQL内获取返回值的方法详解
2020-09-10 20:05:03本篇文章是对mysql存储过程在动态SQL内获取返回值进行了详细的分析介绍,需要的朋友参考下 -
mysql存储过程中,使用SELECT给变量赋值的方式,貌似不支持返回值
2019-01-11 20:50:41mysql存储过程中,使用SELECT给变量赋值的方式,貌似不支持返回值! 知道的小伙伴们,不吝赐教,着急 看图: #4.创建带inout模式参数的存储过程 #案例1:传入number1、number2、number3这3个值,最终这3个数都...