mysql存儲過程游標遍歷
① mysql寫存儲過程的時候,當游標遍歷結束後怎麼讓他跳出
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DONE = 1;
這種語句是異常捕獲內容,在mysql中都是使用HANDLER 來捕獲異常的。
建議你看下:MySQL存儲過程詳解
MySQL游標循環遍歷的使用
② mysql存儲過程游標循環用哪種比較好
如果沒有則插入數據,如果有則更新的方法:
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 存儲過程遍歷游標出錯
MySql 存儲過程遍歷游標出錯
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DONE = 1;
這種語句是異常捕獲內容,在mysql中都是使用HANDLER 來捕獲異常的。
建議你看下:MySQL存儲過程詳解
MySQL游標循環遍歷的使用
④ mysql里怎樣循環遍歷游標
傳入id,輸出name和sex的存儲過程,這里同個id有多條數據,所以需要用到游標。
DELIMITER // CREATE PROCEDURE p5(IN v_id INT) BEGIN DECLARE nodata INT DEFAULT 0;#注意:這個變數聲明必須放在游標聲明前面DECLARE v_name VARCHAR(30); DECLARE v_sex CHAR(3); DECLARE c_ns CURSOR FOR SELECT NAME,sex FROM t WHERE id = v_id; DECLARE EXIT HANDLER FOR NOT FOUND SET nodata = 1;#當讀到數據的最後一條時,設置變數為1 OPEN c_ns; WHILE nodata = 0 DO#判斷是不是到了最後一條數據FETCH c_ns INTO v_name,v_sex; SELECT v_name,v_sex,nodata; END WHILE; CLOSE c_ns; END //
⑤ mysql存儲過程游標結果集時,數據沒有遍歷完整
CREATEDEFINER=`root`@`%`PROCEDURE`insertPresale`()
BEGIN
#Routinebodygoeshere...
DECLAREdoneINTDEFAULT0;/*用於判斷是否結束循環*/
DECLAREgoodsIdVARCHAR(255);#標記商品id
DECLAREflagINTDEFAULT0;#標記資料庫是否包含此條商品記錄
/*用於存儲結果集的記錄*/
/*定義游標*/
_idFROM`sys_goods_publish`WHEREpresale=1ANDpresale_time<=NOW();
/*定義設置循環結束標識done值怎麼改變的邏輯*/
=1;/*done=true;亦可*/
OPENidCur;/*打開游標*/
/*循環開始*/
REPEAT
#/*如果要fetch多列應該這樣寫,fetchcur/*對應下面的idCur*/
FETCHidCurINTOgoodsId;/*還可以fetch多列(假設結果集的記錄不是單列的話)*/
IFNOTdoneTHEN/*數值為非0,MySQL認為是true*/
SELECTCOUNT(*)INTOflagFROM`itemsinfonew`WHERETaoBaoitemId=goodsId;
IF(flag>0)THEN#如果資料庫中有爬取此條記錄則刪除已用戶發布的為准
DELETEFROM`itemsinfonew`WHERETaoBaoitemId=goodsId;
ENDIF;
INSERTINTO`itemsinfonew`(TaoBaoitemId,CouponID,CreateSourceName)
SELECTgoods_id,coupon_id,SUBSTRING("customer_fd",0.5)
FROM`sys_goods_publish`
WHEREpresale_time<=NOW()ANDgoods_id=goodsId;
UPDATE`sys_goods_publish`SETpresale=0WHEREpresale=1ANDpresale_time<=NOW()ANDgoods_id=goodsId;
ENDIF;
UNTILdoneENDREPEAT;
CLOSEidCur;/*關閉游標*/
⑥ mysql存儲過程從表的第二條記錄開始遍歷,怎麼使用游標
在老版本的MySQL3.22中,MySQL的單表限大小為4GB,當時的MySQL的存儲引擎還是ISAM存儲引擎。但是,當出現MyISAM存儲引擎之後,也就是從MySQL3.23開始,MySQL單表最大限制就已經擴大到了64PB了(官方文檔顯示)。也就是說,從目前的技術環境來看,MySQL資料庫的MyISAM存儲引擎單表大小限制已經不是有MySQL資料庫本身來決定,而是由所在主機的OS上面的文件系統來決定了。而MySQL另外一個最流行的存儲引擎之一Innodb存儲數據的策略是分為兩種的,一種是共享表空間存儲方式,還有一種是獨享表空間存儲方式。當使用共享表空間存儲方式的時候,Innodb的所有數據保存在一個單獨的表空間裡面,而這個表空間可以由很多個文件組成,一個表可以跨多個文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中可以看到,其表空間的最大限制為64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,當然這個大小是包括這個表的所有索引等其他相關數據。而當使用獨享表空間來存放Innodb的表的時候,每個表的數據以一個單獨的文件來存放,這個時候的單表限制,又變成文件系統的大小限制了。
⑦ mysql存儲過程里怎麼循環一張表
游標遍歷即可
⑧ Mysql存儲過程中游標的用法實例
本文實例講述了Mysql存儲過程中游標的用法。分享給大家供大家參考。具體如下:
1.
批量插入商戶路由關聯數據:
DELIMITER
$$
USE
`mmm_mac`$$
DROP
PROCEDURE
IF
EXISTS
`批量插入商戶路由關聯數據`$$
CREATE
DEFINER=`root`@`%`
PROCEDURE
`批量插入商戶路由關聯數據`()
BEGIN
DECLARE
v_partner_no
VARCHAR(32);
DECLARE
v_partner_id
INT(11);
DECLARE
v_sc_pid
INT(11);
DECLARE
v_mac_no
VARCHAR(32);
DECLARE
v_mac_addr
VARCHAR(32);
DECLARE
n_mac_no
BIGINT;
DECLARE
n_mac_addr
BIGINT;
DECLARE
n_mac_addr_str
VARCHAR(32);
DECLARE
done
INT;
#取得商戶數據
DECLARE
cur_partnerlist
CURSOR
FOR
SELECT
comp_id,
partner_no,
sc_pid
FROM
mmm_partner.anl_partner;
SET
n_mac_no
=
100000000;
SET
n_mac_addr
=
1000000000;
OPEN
cur_partnerlist;
REPEAT
FETCH
cur_partnerlist
INTO
v_partner_id,v_partner_no,v_sc_pid;
SET
v_mac_no
=
CONCAT('MAC',v_sc_pid,n_mac_no);
SET
n_mac_addr_str
=
CONCAT(SUBSTR(n_mac_addr,1,2),':',SUBSTR(n_mac_addr,3,2),':',SUBSTR(n_mac_addr,5,2),':',SUBSTR(n_mac_addr,7,2),':',SUBSTR(n_mac_addr,9,2));
SET
v_mac_addr
=
CONCAT('CC:',n_mac_addr_str);
SET
n_mac_no
=
n_mac_no
+
1;
SET
n_mac_addr
=
n_mac_addr
+
1;
#向t_machine_sc_config表中插入商戶關聯路由的數據
#insert
into
t_machine_sc_config(mac_no,
partner_no,
partner_id,
sc_pid,
mac_addr,
comp_id,
is_lock)
values('MAC2016000000001','44060430603381',1,4403,'C8:87:18:AB:79:66',1,1);
INSERT
INTO
t_machine_sc_config(mac_no,
partner_no,
partner_id,
sc_pid,
mac_addr,
comp_id,
is_lock)
VALUES(v_mac_no,v_partner_no,v_partner_id,v_sc_pid,v_mac_addr,1,1);
UNTIL
0
END
REPEAT;
CLOSE
cur_partnerlist;
END$$
DELIMITER
;
2.
更新商戶表:
DELIMITER
$$
USE
`mmm_partner`$$
DROP
PROCEDURE
IF
EXISTS
`更新商戶表`$$
CREATE
DEFINER=`root`@`%`
PROCEDURE
`更新商戶表`()
BEGIN
DECLARE
v_partner_no
VARCHAR(32);
DECLARE
vpartner_no
VARCHAR(32);
DECLARE
v_partner_id
VARCHAR(32);
DECLARE
n
BIGINT;
DECLARE
partnerid_list
CURSOR
FOR
SELECT
comp_id
FROM
100msh_partner.anl_partner
WHERE
TRIM(partner_no)
=
'';
SET
vpartner_no
=
'2015415parno';
SET
n
=
10000000;
OPEN
partnerid_list;
REPEAT
FETCH
partnerid_list
INTO
v_partner_id;
SET
v_partner_no
=
CONCAT(vpartner_no,n);
SET
n
=
n
+
1;
UPDATE
mmm_partner.anl_partner
SET
partner_no
=
v_partner_no
WHERE
comp_id
=
v_partner_id;
UNTIL
0
END
REPEAT;
CLOSE
partnerid_list;
END$$
DELIMITER
;
希望本文所述對大家的mysql資料庫程序設計有所幫助。
⑨ mysql 存儲過程過程 循環游標
游標關閉條件
⑩ mysql使用游標遍歷數據進行批量針對性更新數據,急求mysql大神解答
根據你的資料,正確的答案應該如下:望採納
CREATE DEFINER=`root`@`localhost` PROCEDURE `P_updateUd18`(`Param` int(11))
BEGIN
declare Rcount,i,j,k,Rparentid,myId int(11) default 0;
declare Robjname,Robjname23,Robjname45,Robjname67,Robjname89 varchar(9) default "";
select count(id) into Rcount from ud18;
repeat
select id,objname into myId,Robjname from ud18 order by id limit i,1;
set Robjname23=SUBSTRING(Robjname,2,2);
set Robjname45=SUBSTRING(Robjname,4,2);
set Robjname67=SUBSTRING(Robjname,6,2);
set Robjname89=SUBSTRING(Robjname,8,2);
if Robjname89>0 then
set @sql=concat("select id into @abc from ud18 where objname like '",left(Robjname,7),"00","'");
prepare stmt from @sql;
EXECUTE stmt;
set Rparentid=@abc;
update ud18 set parentid=Rparentid where id=myId;
elseif Robjname67>0 then
set @sql=concat("select id into @abc from ud18 where objname like '",left(Robjname,5),"0000","'");
prepare stmt from @sql;
EXECUTE stmt;
set Rparentid=@abc;
update ud18 set parentid=Rparentid where id=myId;
elseif Robjname45>0 then
set @sql=concat("select id into @abc from ud18 where objname like '",left(Robjname,3),"000000","'");
prepare stmt from @sql;
EXECUTE stmt;
set Rparentid=@abc;
update ud18 set parentid=Rparentid where id=myId;
elseif Robjname23>0 then
-- set @sql=concat("select id into @abc from ud18 where objname like '",left(Robjname,1),"00000000","'");
-- prepare stmt from @sql;
-- EXECUTE stmt;
-- set Rparentid=@abc;
update ud18 set parentid=0 where id=myId;
else
set j=0;
end if;
set i=i+1;
until i>Rcount end repeat;
END;