真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql怎么寫游標(biāo),mysql可以用什么來(lái)聲明游標(biāo)

求mysql的游標(biāo)用法詳細(xì)說(shuō)明,最好有例子?。?/h2>

先聲明一個(gè)游標(biāo),語(yǔ)法:

創(chuàng)新互聯(lián)是一家專業(yè)提供潼關(guān)企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都做網(wǎng)站、HTML5、小程序制作等業(yè)務(wù)。10年已為潼關(guān)眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

DECLARE v_1 VARCHAR(16);

DECLARE v_2 VARCHAR(16);

DECLARE c_XXX CURSOR FOR

SELECT c_1, c_2

FROM t_1;

同時(shí)聲明一個(gè)布爾型的變量FOUND,當(dāng)循環(huán)的條件不成立時(shí),結(jié)束循環(huán)用的。

DECLARE FOUND BOOLEAN DEFAULT TRUE;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET FOUND = FALSE;

在使用游標(biāo)的時(shí)候,要先打開(kāi)游標(biāo),語(yǔ)法:OPEN c_XXX;

使用的時(shí)候,要先打開(kāi)游標(biāo),取出第一條數(shù)據(jù),語(yǔ)法: FETCH c_XXX INTO v_1, v_2;

然后才開(kāi)始執(zhí)行循環(huán),語(yǔ)法:WHILE FOUND DO

執(zhí)行需要執(zhí)行的語(yǔ)句;

取下一條數(shù)據(jù)放到當(dāng)前游標(biāo)中,F(xiàn)ETCH c_XXX INTO v_1, v_2;

結(jié)束循環(huán),語(yǔ)法:END WHILE;

結(jié)束游標(biāo),語(yǔ)法:CLOSE c_cargo。有什么問(wèn)題我們?cè)贉贤ò?。不知道你具體要問(wèn)題的是什么。

Mysql 游標(biāo)示例

CREATE? PROCEDURE `gk_test`()

COMMENT '測(cè)試數(shù)據(jù)'? -- 函數(shù)注釋

BEGIN

DECLARE done INT DEFAULT FALSE;?-- 定義遍歷數(shù)據(jù)結(jié)束標(biāo)志。非游標(biāo)變量,需要定義在游標(biāo)變量前

DECLARE m_id CHAR(32);?-- 定義接收游標(biāo)數(shù)據(jù)中id變量

DECLARE m_or VARCHAR(255);?--?定義接收游標(biāo)數(shù)據(jù)中orderno變量

DECLARE m_c INT(11);??--?定義接收游標(biāo)數(shù)據(jù)中count變量

DECLARE m_soult CURSOR FOR SELECT `id`, `orderno`, count(*) t FROM hb_shipper_order GROUP BY orderno HAVING t 1;???-- 定義游標(biāo)變量,即接收查詢結(jié)果集

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;??-- 將結(jié)束標(biāo)志綁定到游標(biāo)

OPEN m_soult;? ??-- 打開(kāi)游標(biāo)

read_loop:LOOP? ?-- 開(kāi)始循環(huán)。這個(gè)是mysql 3種循環(huán)中的1種。

FETCH m_soult INTO m_id,m_or,m_c;???-- 提取游標(biāo)數(shù)據(jù)

IF done THEN? ?-- 判斷,當(dāng)為true時(shí)

LEAVE read_loop;? ?-- 跳出循環(huán)

END IF;

-- 處理事 自己想處理的事

UPDATE `hb_shipper_waybill` SET

ordernos = REPLACE (`ordernos`, m_or, CONCAT(m_or,'-2')),

goodsname = REPLACE (`goodsname`, m_or, CONCAT(m_or,'-2'))

WHERE `id` IN ( SELECT `waybillid` FROM `hb_shipper_order_waybill_relation` WHERE orderid = m_id);

UPDATE `hb_shipper_order` SET orderno = CONCAT(m_or,'-2') WHERE id = m_id;

END LOOP;? -- 結(jié)束循環(huán)

-- 關(guān)閉游標(biāo)

CLOSE m_soult;

END

上圖:

DEMO: 2? ? // 通過(guò) 存儲(chǔ)過(guò)程,處理? copy 數(shù)據(jù)并處理對(duì)應(yīng)數(shù)據(jù)關(guān)系

delimiter $$

DROP PROCEDURE IF EXISTS gk;

CREATE DEFINER =? PROCEDURE `gk`(IN pname varchar(255))

COMMENT '測(cè)試'

BEGIN

DECLARE new_id CHAR(32);

DECLARE m_id CHAR(32);

DECLARE new_noids VARCHAR(255);

DECLARE done INT DEFAULT 0;

DECLARE m_result CURSOR FOR select id from `xxx`;

DECLARE m_result2 CURSOR FOR select id from `xxx`;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

DROP TABLE IF EXISTS `xxx`;

CREATE TABLE `xxx` (

`id` char(32) NOT NULL COMMENT 'ID',

`subsystem` char(32) NOT NULL COMMENT '',

`name` varchar(20) NOT NULL COMMENT '',

`type` varchar(15) NOT NULL COMMENT '',

`url` varchar(200) DEFAULT NULL COMMENT '',

`icon` varchar(20) DEFAULT NULL COMMENT '',

`target` varchar(10) NOT NULL DEFAULT '_self' COMMENT '',

`method` mediumtext COMMENT '',

`orderby` smallint(3) NOT NULL DEFAULT '0' COMMENT '',

`parentid` char(32) NOT NULL DEFAULT '0' COMMENT '',

`relateid` char(32) NOT NULL COMMENT '',

`isopen` tinyint(1) NOT NULL DEFAULT '1' COMMENT '',

`nodeids` varchar(255) DEFAULT NULL COMMENT '',

`nodenum` smallint(3) NOT NULL DEFAULT '0' COMMENT '',

`createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '',

`createuser` char(32) NOT NULL DEFAULT '0' COMMENT '',

`updatetime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '',

`udateuser` char(32) NOT NULL DEFAULT '0' COMMENT '',

`deleted` tinyint(1) DEFAULT '0' COMMENT '',

`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '',

`isdefault` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '',

? ? ? ? ? ? `isdisable` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '',

`projecttype` varchar(255) NOT NULL COMMENT '',

? ? ????PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

INSERT INTO `xxxx` SELECT * FROM `aaa` WHERE `projecttype` = 'T';

UPDATE `xxx` SET `projecttype` = pname;

OPEN m_result;

REPEAT

FETCH m_result INTO m_id;

SET new_id = UPPER(REPLACE(UUID(),'-',''));

UPDATE `xxx` SET `id` = new_id WHERE `id` = m_id;

UPDATE `xxx` SET `parentid` = new_id WHERE `parentid` = m_id;

UNTIL done END REPEAT;

CLOSE m_result;

SET done = 0;

OPEN m_result2;

REPEAT

FETCH m_result2 INTO m_id;

SELECT CONCAT(',', GROUP_CONCAT(`id`)) INTO new_noids FROM `xxx` WHERE `parentid` = m_id;

UPDATE `xxx` SET `nodeids` = new_noids WHERE `id` = m_id;

UNTIL done END REPEAT;????

CLOSE m_result2;

INSERT INTO `aaa` SELECT * FROM `xxx`;

DROP TABLE IF EXISTS xxx;

END $$

delimiter ;

mysql 麻煩幫忙寫一個(gè)游標(biāo)

給個(gè)例子自己參考這做吧

DELIMITER $$

CREATE PROCEDURE build_email_list (INOUT email_list varchar(4000))

BEGIN

DECLARE v_finished INTEGER DEFAULT 0;

DECLARE v_email varchar(100) DEFAULT "";

-- declare cursor for employee email

DEClARE email_cursor CURSOR FOR

SELECT email FROM employees;

-- declare NOT FOUND handler

DECLARE CONTINUE HANDLER

FOR NOT FOUND SET v_finished = 1;

OPEN email_cursor;

get_email: LOOP

FETCH email_cursor INTO v_email;

IF v_finished = 1 THEN

LEAVE get_email;

END IF;

-- build email list

SET email_list = CONCAT(v_email,";",email_list);

END LOOP get_email;

CLOSE email_cursor;

END$$

DELIMITER ;

MySQL 游標(biāo)的定義與使用

從字面可以這么理解什么是游標(biāo),游標(biāo)就像是水面上漂浮的一個(gè)標(biāo)記,這個(gè)標(biāo)記可以來(lái)回游動(dòng),一會(huì)游到這里一會(huì)游到那里,這里的河水可以理解為是數(shù)據(jù)的集合,這個(gè)標(biāo)記就是在這些數(shù)據(jù)間來(lái)回游動(dòng)。

為什么 MySQL 會(huì)有游標(biāo)這個(gè)概念,由于 SQL 語(yǔ)言是面向集合的語(yǔ)句,它每次查詢出來(lái)都是一堆數(shù)據(jù)的集合,沒(méi)有辦法對(duì)其中一條記錄進(jìn)行單獨(dú)的處理。如果要對(duì)每條記錄進(jìn)行單獨(dú)處理就需要游標(biāo)。

游標(biāo)其實(shí)就像是編程語(yǔ)言中的 for/foreach 循環(huán),把一個(gè)數(shù)組(數(shù)據(jù)的集合)中每條數(shù)據(jù)一條一條地循環(huán)出來(lái),然后你在 for/foreach 循環(huán)中使用判斷語(yǔ)句對(duì)你感興趣的數(shù)據(jù)進(jìn)行處理。

哪里可以使用游標(biāo)呢,函數(shù),存儲(chǔ)過(guò)程,觸發(fā)器中都可以使用。

說(shuō)完概念,就來(lái)看下游標(biāo)的固定寫法。不管概念是否理解,記住下面的固定模式也可以完成搬磚任務(wù)。

1、聲明游標(biāo)

SELECT 語(yǔ)句就是正常的查詢語(yǔ)句,例如:SELECT id,age FROM table;

2、打開(kāi)游標(biāo)

在打開(kāi)游標(biāo)之前,游標(biāo)定義的 SQL 語(yǔ)句是不執(zhí)行的。

3、取出記錄

將當(dāng)前的記錄數(shù)據(jù)存入變量。

當(dāng) FETCH 沒(méi)有找到記錄時(shí)會(huì)拋出異常,異常的定義需要下面的 HANDLER FOR 語(yǔ)句。

聲明游標(biāo)語(yǔ)句中的 SELECT 如果有多個(gè)字段,INTO 后面需要多個(gè)變量進(jìn)行接收。

4、設(shè)置結(jié)束條件

這個(gè)語(yǔ)句的作用是指定一個(gè)條件,告訴程序所有數(shù)據(jù)已經(jīng)循環(huán)完畢,可以結(jié)束了。由于游標(biāo)是使用 WHILE 循環(huán)進(jìn)行每條數(shù)據(jù)的讀取,就需要給 WHILE 一個(gè)結(jié)束條件。

處理種類:可以是, EXIT 立即結(jié)束。CONTINUE 繼續(xù)下面的處理。

異常的類型:一般指定為 NOT FOUND ,意思是沒(méi)有找到任何數(shù)據(jù)。

異常發(fā)生時(shí)的處理:當(dāng)異常發(fā)生時(shí)需要做的事情,這里一般改變一個(gè)變量的值來(lái)記錄異常已經(jīng)發(fā)生了,如如 SET flat = 1 詳細(xì)用法查看下面的例子。

5、關(guān)閉游標(biāo)

實(shí)戰(zhàn)代碼:

完畢,看懂沒(méi),如果沒(méi)看懂沒(méi)關(guān)系,游標(biāo)處理是一套固定的格式,按照上面例子中固定的格式套入到你的程序就可以了。

MySQL 存儲(chǔ)過(guò)程,獲取使用游標(biāo)查詢的結(jié)果集

MySQL 存儲(chǔ)過(guò)程中,使用游標(biāo)查詢,返回的是結(jié)果集時(shí),如何查看調(diào)用存儲(chǔ)過(guò)程輸出結(jié)果呢?

解決方案:存儲(chǔ)過(guò)程不返回?cái)?shù)據(jù),但它能創(chuàng)建和填充另一個(gè)表。所以在存儲(chǔ)過(guò)程運(yùn)行中創(chuàng)建臨時(shí)表。該臨時(shí)表將保存存儲(chǔ)過(guò)程中生成的結(jié)果集,在遍歷游標(biāo)時(shí),用insert保存每條數(shù)據(jù)到臨時(shí)表中。后續(xù)調(diào)用時(shí)可以用select語(yǔ)句查詢臨時(shí)表中的存儲(chǔ)過(guò)程運(yùn)行結(jié)果。

以下有 三種方式 使用游標(biāo)創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,統(tǒng)計(jì)某一部門下的員工信息

方法一:Loop循環(huán)

調(diào)用存儲(chǔ)過(guò)程:

方法二:While 循環(huán)

調(diào)用存儲(chǔ)過(guò)程:

方法三:REPEAT 循環(huán)

調(diào)用存儲(chǔ)過(guò)程:

上述三種實(shí)現(xiàn)方法在測(cè)試過(guò)程中遇到下述問(wèn)題。

調(diào)用存儲(chǔ)過(guò)程查詢臨時(shí)表輸出結(jié)果時(shí),會(huì)發(fā)現(xiàn)多循環(huán)了一次,像這樣:

解決方法:

在遍歷游標(biāo)查詢結(jié)果時(shí),先判斷游標(biāo)的結(jié)束標(biāo)志(done) 是否是為1,如果不是1,則向臨時(shí)表中插入數(shù)據(jù)。


網(wǎng)頁(yè)名稱:mysql怎么寫游標(biāo),mysql可以用什么來(lái)聲明游標(biāo)
鏈接URL:http://weahome.cn/article/hocgdo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部