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;