欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

mysql怎么給游標(biāo)數(shù)據(jù),mysql 存儲過程游標(biāo)

mysql怎么使用游標(biāo)和數(shù)據(jù)表實(shí)現(xiàn)數(shù)組功能

有兩種方法,一種方法使用mysql的check table和repair table 的sql語句,另一種方法是使用MySQL提供的多個myisamchk, isamchk數(shù)據(jù)檢測恢復(fù)工具。前者使用起來比較簡便。推薦使用。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、南召網(wǎng)站維護(hù)、網(wǎng)站推廣。

1. check table 和 repair table

登陸mysql 終端:

mysql -uxxxxx -p dbname

check table tabTest;

如果出現(xiàn)的結(jié)果說Status是OK,則不用修復(fù),如果有Error,可以用:

repair table tabTest;

進(jìn)行修復(fù),修復(fù)之后可以在用check table命令來進(jìn)行檢查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。

2. myisamchk, isamchk

其中myisamchk適用于MYISAM類型的數(shù)據(jù)表,而isamchk適用于ISAM類型的數(shù)據(jù)表。這兩條命令的主要參數(shù)相同,一般新的系統(tǒng)都使用MYISAM作為缺省的數(shù)據(jù)表類型,這里以myisamchk為例子進(jìn)行說明。當(dāng)發(fā)現(xiàn)某個數(shù)據(jù)表出現(xiàn)問題時(shí)可以使用:

myisamchk tablename.MYI

進(jìn)行檢測,如果需要修復(fù)的話,可以使用:

myisamchk -of tablename.MYI

關(guān)于myisamchk的詳細(xì)參數(shù)說明,可以參見它的使用幫助。需要注意的時(shí)在進(jìn)行修改時(shí)必須確保MySQL服務(wù)器沒有訪問這個數(shù)據(jù)表,保險(xiǎn)的情況下是最好在進(jìn)行檢測時(shí)把MySQL服務(wù)器Shutdown掉。

mysql使用游標(biāo)遍歷數(shù)據(jù)進(jìn)行批量針對性更新數(shù)據(jù),急求mysql大神解答

根據(jù)你的資料,正確的答案應(yīng)該如下:望采納

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 Robjname890 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 Robjname670 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 Robjname450 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 Robjname230 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 iRcount end repeat;

END;

誰有有關(guān)MYSQL游標(biāo)的知識

比較基礎(chǔ)的

可以用在存儲過程的SQL語句主要有以下類型:

1、

無返回結(jié)果語句,如:INSERT,UPDATE,DROP,

DELETE等

2、

select語句返回單行變量并可傳給本地變量(select

..into)

3、

返回多行結(jié)果集的select語句,并可使用游標(biāo)循環(huán)處理

注意,存儲過程返回的多行結(jié)果集,可以被客戶端程序(如php)所接收,但要在一個存儲過程中接收另一個存儲過程的結(jié)果集是不可能的,一般解決辦法是存入臨時(shí)表供其它過程共用

4、

prepare語句

以下主要講述游標(biāo)及prepare部分

游標(biāo)

定義

DECLARE

cursor_name

CURSOR

FOR

SELECT_statement;

游標(biāo)操作

OPEN

打開游標(biāo)

OPEN

cursor_name;

FETCH

獲取游標(biāo)當(dāng)前指針的記錄,并傳給指定變量列表,注意變量數(shù)必須與游標(biāo)返回的字段數(shù)一致,要獲得多行數(shù)據(jù),使用循環(huán)語句去執(zhí)行FETCH

FETCH

cursor_name

INTO

variable

list;

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

CLOSE

cursor_name

;

注意:mysql的游標(biāo)是向前只讀的,也就是說,你只能順序地從開始往后讀取結(jié)果集,不能從后往前,也不能直接跳到中間的記錄.

一個完整的例子:

--

定義本地變量

DECLARE

o

varchar(128);

--

定義游標(biāo)

DECLARE

ordernumbers

CURSOR

FOR

SELECT

callee_name

FROM

account_tbl

where

acct_timeduration=10800;

DECLARE

CONTINUE

HANDLER

FOR

NOT

FOUND

SET

no_more_departments=1;

SET

no_more_departments=0;

--

打開游標(biāo)

OPEN

ordernumbers;

--

循環(huán)所有的行

REPEAT

--

Get

order

number

FETCH

ordernumbers

INTO

o;

update

account

set

allMoney=allMoney+72,lastMonthConsume=lastMonthConsume-72

where

NumTg=@o;

--

循環(huán)結(jié)束

UNTIL

no_more_departments

END

REPEAT;

--

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

CLOSE

ordernumbers;

Mysql 游標(biāo)示例

CREATE? PROCEDURE `gk_test`()

COMMENT '測試數(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;? ??-- 打開游標(biāo)

read_loop:LOOP? ?-- 開始循環(huán)。這個是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? ? // 通過 存儲過程,處理? copy 數(shù)據(jù)并處理對應(yīng)數(shù)據(jù)關(guān)系

delimiter $$

DROP PROCEDURE IF EXISTS gk;

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

COMMENT '測試'

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 游標(biāo)的定義與使用

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

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

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

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

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

1、聲明游標(biāo)

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

2、打開游標(biāo)

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

3、取出記錄

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

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

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

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

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

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

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

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

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

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

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

分享名稱:mysql怎么給游標(biāo)數(shù)據(jù),mysql 存儲過程游標(biāo)
本文網(wǎng)址:http://chinadenli.net/article32/dsejesc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司搜索引擎優(yōu)化面包屑導(dǎo)航網(wǎng)站排名網(wǎng)站設(shè)計(jì)網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化