mysql存储过程for循环
如果没有则插入数据,如果有则更新的方法:
insert into `test` values (a,b) ON DUPLICATE KEY UPDATE `a`=c;
[sql] view plain
CREATE PROCEDURE `test`.`new_procere` ()
BEGIN
-- 需要定义接收游标数据的变量
DECLARE a CHAR(16);
-- 游标
DECLARE cur CURSOR FOR SELECT i FROM test.t;
-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打开游标
OPEN cur;
-- 开始循环
read_loop: LOOP
-- 提取游标里的数据,这里只有一个,多个的话也一样;
FETCH cur INTO a;
-- 声明结束的时候
IF done THEN
LEAVE read_loop;
END IF;
-- 这里做你想做的循环的事件
INSERT INTO test.t VALUES (a);
END LOOP;
-- 关闭游标
CLOSE cur;
END
实例2
[sql] view plain
BEGIN
DECLARE Done INT DEFAULT 0;
DECLARE CurrentLingQi INT;
DECLARE ShizuName VARCHAR(30);
/* 声明游标 */
DECLARE rs CURSOR FOR SELECT NodeName, LingQi FROM socialrelation;
/* 异常处理 */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
/* 打开游标 */
OPEN rs;
/* 逐个取出当前记录LingQi字段的值,需要进行最大值的判断 */
FETCH NEXT FROM rs INTO ShizuName, CurrentLingQi;
/* 遍历数据表 */
REPEAT
IF NOT Done THEN
SET CurrentLingQi = CurrentLingQi + 60;
/* 如果更新后灵气值大于允许的最大值,则就设置为最大值 */
IF CurrentLingQi >= 1800 THEN
UPDATE socialrelation SET LingQi = 1800 WHERE NodeName = ShizuName;
ELSE
/* 否则,正常更新 */
UPDATE socialrelation SET LingQi = LingQi + 60 WHERE NodeName = ShizuName;
END IF;
END IF;
FETCH NEXT FROM rs INTO ShizuName, CurrentLingQi;
UNTIL Done END REPEAT;
/* 关闭游标 */
CLOSE rs;
END
‘贰’ mysql 使用存储过程 循环查找数据
delimiter
$$
mysql>
mysql>
CREATE
PROCEDURE
myProc()
//创建while循环的存储过程
if分支语句示例
->
BEGIN
->
->
DECLARE
i
int;
->
SET
i=1;
->
loop1:
WHILE
i<=10
DO
->
IF
MOD(i,2)<>0
THEN
/*Even
number
-
try
again*/
->
SELECT
CONCAT(i,"
is
an
odd
number");
->
END
IF;
->
SET
i=i+1;
->
END
WHILE
loop1;
->
END$$
Query
OK,
0
rows
affected
(0.00
sec)
这种也可以
‘叁’ mysql 存储过程嵌套循环 第一次内循环能插入数据,之后不能成功插入数据,求解!!
1. 首先你应该看下循环条件是否已经走完,
2. 其次看所插数据是否满足表中的字段格式,再然后,看看SQL有没有明显的错误。
3. 如果检查完还没好,麻烦把SQL发我,我看下。
‘肆’ mysql sql中流程控制有for循环吗
MySQL不支持FOR loops循环。
只有LOOP循环:
[begin_label:] LOOP
statement_list
END LOOP [end_label]
CREATE PROCEDURE doiterate(p1 INT)
BEGIN
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN
ITERATE label1;
END IF;
LEAVE label1;
END LOOP label1;
SET @x = p1;
END;
LOOP实现了一个简单的循环结构,允许重复执行语句列表,该列表由一个或多个语句组成,每个语句以分号(;)分隔符结束。 循环中的语句将重复执行,直到循环终止。 一般情况,通过LEAVE终止循环。 在函数中,也可以使用RETURN,它完全退出函数,也同时终止循环。
(4)mysql存储过程for循环扩展阅读
mysql流程控制结构:
顺序结构:程序从上往下依次执行,
分支结构:程序从两条或多条路径中选中一条去执行,
循环结构:程序在满足一定条件的基础上,重复执行一段代码。
分支结构
1、if函数
功能:实现简单的双分支
语法:
if(表达式1,表达式2,表达式3)
执行顺序:
如果表达式1成立,则if函数返回表达式2的值,否则返回表达式3的值
应用:任何地方(在begin end中或外面都可以)
2、case结构
情况1:类似于java中的switch语句,一般用于实现等值判断
语法:
CASE 变量|表达式|字段
WHEN 要判断的值 THEN 返回的值1或语句1;
WHEN 要判断的值 THEN 返回的值2或语句2;
...
ELSE 要返回的值n或语句n;
END CASE;
情况2:类似于java中的多重IF语句,一般用于实现区间判断
语法;
CASE
WHEN 要判断的条件1 THEN 返回的值1或语句1;
WHEN 要判断的条件2 THEN 返回的值2或语句2;
...
ELSE 要返回的值n或语句n;
END CASE;
‘伍’ mysql存储过程中怎么在循环中取变量值
CREATE PROCEDURE LOOPINSERT()
BEGIN
DECLARE V_I INT DEFAULT 0;
START TRANSACTION;
WHILE V_I<=5 DO
SET V_I=V_I+1;
SET @V=V_I;
SET @INSERTSTR=CONCAT('INSERT INTO TB_LOG(ID) VALUES(?)');
PREPARE STMT FROM @INSERTSTR;
EXECUTE STMT USING @V;
END WHILE;
DEALLOCATE PREPARE STMT;
COMMIT;
END;
与以上代码类似
‘陆’ mysql 创建存储过程中用到循环,怎么通过select返回结果集
测试表与测试数据
CREATETABLETestMulToOne(
nameVARCHAR(10),
allTitlesVARCHAR(200)
);
INSERTINTOTestMulToOneVALUES('张三','程序员,系统管理员,网络管理员');
INSERTINTOTestMulToOneVALUES('李四','项目经理,系统分析员');
DELIMITER//
DROPFUNCTIONGetTextCount//
/**********
--获取字符串中有几个部分.
**********/
CREATEFUNCTIONGetTextCount(pSourceTextVARCHAR(255),pDivCharCHAR(1))
RETURNSTINYINT
BEGIN
--预期结果.
DECLAREvResultTINYINT;
--当前逗号的位置.
DECLAREvIndexINT;
--前一个逗号的位置.
DECLAREvPrevIndexINT;
--结果的初始值.
SETvResult=1;
--查询第一个逗号的位置.
SETvIndex=INSTR(pSourceText,pDivChar);
IFvIndex=0THEN
--参数中没有逗号,直接返回.
RETURNvResult;
ENDIF;
--初始化情况,前一个逗号不存在.
SETvPrevIndex=0;
--循环处理。
WHILEvIndex>0DO
--结果递增.
SETvResult=vResult+1;
--前一个逗号的位置=当前逗号的位置
SETvPrevIndex=vIndex;
--查询下一个逗号的位置.
SETvIndex=LOCATE(pDivChar,pSourceText,vPrevIndex+1);
ENDWHILE;
--返回结果.
RETURNvResult;
END;
//
DROPFUNCTIONGetTextValue//
/**********
--获取字符串中具体某一个部分的数据.
**********/
CREATEFUNCTIONGetTextValue(pSourceTextVARCHAR(255),pDivCharCHAR(1),pIndexTINYINT)
RETURNSVARCHAR(255)
BEGIN
--预期结果.
DECLAREvResultVARCHAR(255);
IFpIndex=1THEN
SELECTSUBSTRING_INDEX(pSourceText,pDivChar,1)INTOvResult;
ELSE
SELECT
REPLACE(
SUBSTRING_INDEX(pSourceText,pDivChar,pIndex),
CONCAT(SUBSTRING_INDEX(pSourceText,pDivChar,pIndex-1),pDivChar),
'')INTOvResult;
ENDIF;
--返回.
RETURNvResult;
END;
//
DELIMITER;
/*
SELECTGetTextCount('程序员,系统管理员,网络管理员',',')ASCo;
SELECT
GetTextValue('程序员,系统管理员,网络管理员',',',1)ASA,
GetTextValue('程序员,系统管理员,网络管理员',',',2)ASB,
GetTextValue('程序员,系统管理员,网络管理员',',',3)ASC;
*/SELECT
t.name,
GetTextValue(t.allTitles,',',MaxNum.No)ASOneTitle
FROM
TestMulToOnet,
(SELECT1NoUNIONALL
SELECT2NoUNIONALL
SELECT3NoUNIONALL
SELECT4NoUNIONALL
SELECT5No)MaxNum
WHERE
GetTextCount(t.allTitles,',')>=MaxNum.No
ORDERBY
t.name;
+------+------------+
|name|OneTitle|
+------+------------+
|张三|系统管理员|
|张三|网络管理员|
|张三|程序员|
|李四|系统分析员|
|李四|项目经理|
+------+------------+
5rowsinset(0.00sec)
‘柒’ mysql存储过程里怎么循环一张表
给你一个 参考
--存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数
create procere p_procerecode(in sumdate varchar(10))
begin
declare v_sql varchar(500); --需要执行的SQL语句
declare sym varchar(6);
declare var1 varchar(20);
declare var2 varchar(70);
declare var3 integer;
--定义游标遍历时,作为判断是否遍历完全部记录的标记
declare no_more_departments integer DEFAULT 0;
--定义游标名字为C_RESULT
DECLARE C_RESULT CURSOR FOR
SELECT barcode,barname,barnum FROM tmp_table;
--声明当游标遍历完全部记录后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_departments=1;
set sym=substring(sumdate,1,6); --截取字符串,并将其赋值给一个遍历
--连接字符串构成完整SQL语句,动态SQL执行后的结果记录集,在MySQL中无法获取,因此需要转变思路将其放置到一个临时表中(注意代码中的写法)。一般写法如下:
-- 'Create TEMPORARY Table 表名(Select的查询语句);
set v_sql= concat('Create TEMPORARY Table tmp_table(select aa as aacode,bb as aaname,count(cc) as ccnum from h',sym,' where substring(dd,1,8)=''',sumdate,''' group by aa,bb)');
set @v_sql=v_sql; --注意很重要,将连成成的字符串赋值给一个变量(可以之前没有定义,但要以@开头)
prepare stmt from @v_sql; --预处理需要执行的动态SQL,其中stmt是一个变量
EXECUTE stmt; --执行SQL语句
deallocate prepare stmt; --释放掉预处理段
OPEN C_RESULT; --打开之前定义的游标
REPEAT --循环语句的关键词
FETCH C_RESULT INTO VAR1, VAR2, VAR3; --取出每条记录并赋值给相关变量,注意顺序
--执行查询语句,并将获得的值付给一个变量 @oldaacode(注意如果以@开头的变量可以不用通过declare语句事先声明)
select @oldaacode:=vcaaCode from T_sum where vcaaCode=var1 and dtDate=sumdate;
if @oldaacode=var1 then --判断
update T_sum set iNum=var3 where vcaaCode=var1 and dtDate=sumdate;
else
insert into T_sum(vcaaCode,vcaaName,iNum,dtDate) values(var1,var2,var3,sumdate);
end if;
UNTIL no_more_departments END REPEAT; --循环语句结束
CLOSE C_RESULT; --关闭游标
DROP TEMPORARY TABLE tmp_table; --删除临时表
end;