1. 程式人生 > >MySQL 遊標(PREPARE預處理語句)

MySQL 遊標(PREPARE預處理語句)

概述

本章節介紹使用遊標來批量進行表操作,包括批量新增索引、批量新增欄位等。如果對儲存過程、變數定義、預處理還不是很熟悉先閱讀我前面寫過的關於這三個概念的文章,只有先了解了這三個概念才能更好的理解這篇文章。

正文

游標宣告

宣告游標

DECLARE cursor_name CURSOR FOR select_statement

這個語句宣告一個游標。也可以在子程式中定義多個游標,但是一個塊中的每一個游標必須有唯一的名字。

注意:SELECT語句不能有INTO子句。

開啟游標

OPEN cursor_name

這個語句開啟先前宣告的游標。

前進游標

FETCH cursor_name INTO var_name [, var_name] ...

這個語句用指定的開啟游標讀取下一行(如果有下一行的話),並且前進游標指標。

關閉游標

CLOSE cursor_name

這個語句關閉先前開啟的游標。 

批量新增索引

共享一個批量新增索引的遊標,當一個庫中有上百張表結構一樣但是名稱不一樣的表,這個時候批量操作就變得簡單了。

#刪除建立儲存過程
DROP
PROCEDURE IF EXISTS FountTable; DELIMITER $$
CREATE PROCEDURE FountTable() BEGIN DECLARE TableName varchar(64);
#宣告遊標
DECLARE cur_FountTable CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='front' AND TABLE_NAME LIKE 'student%'; DECLARE EXIT HANDLER FOR not found CLOSE cur_FountTable; #開啟遊標
OPEN cur_FountTable; REPEAT FETCH cur_FountTable INTO TableName; #定義預處理 SET @SQLSTR1 = CONCAT('create index Flag on ','`',TableName,'`',' (Flag); '); SET @SQLSTR2 = CONCAT('create index State on ','`',TableName,'`',' (State); '); SET @SQLSTR3 = CONCAT('create index upload on ','`',TableName,'`',' (upload); '); SET @SQLSTR4 = CONCAT('create index ccFlag on ','`',TableName,'`',' (lockFlag); '); SET @SQLSTR5 = CONCAT('create index comes on ','`',TableName,'`',' (comes); '); ###SET @SQLSTR=CONCAT(@SQLSTR1,@SQLSTR2,@SQLSTR3,@SQLSTR4,@SQLSTR5 ); PREPARE STMT1 FROM @SQLSTR1; PREPARE STMT2 FROM @SQLSTR2; PREPARE STMT3 FROM @SQLSTR3; PREPARE STMT4 FROM @SQLSTR4; PREPARE STMT5 FROM @SQLSTR5; EXECUTE STMT1; EXECUTE STMT2; EXECUTE STMT3; EXECUTE STMT4; EXECUTE STMT5; DEALLOCATE PREPARE STMT1; DEALLOCATE PREPARE STMT2; DEALLOCATE PREPARE STMT3; DEALLOCATE PREPARE STMT4; DEALLOCATE PREPARE STMT5; # SELECT @SQLSTR; UNTIL 0 END REPEAT; #關閉遊標 CLOSE cur_FountTable; END $$ DELIMITER ; CALL FountTable();

這裡有幾個細節:

  • 在宣告遊標的時候記得修改自己需要查詢的條件
  • 在預處理這裡也需要改成對應的欄位
  • 在定義條件變數的時候這裡我使用的是EXIT就是遇到錯誤就中斷,當然也可以使用CONTINUE 。

遊標巢狀授權 

DROP PROCEDURE IF EXISTS pro_grant_pri;
DELIMITER $$
CREATE PROCEDURE pro_grant_pri()
BEGIN
    DECLARE cur1_username varchar(128);
    DECLARE cur2_dbname varchar(128);
    DECLARE done int;
    
    DECLARE cur1 CURSOR FOR SELECT username FROM testuser;
    DECLARE cur2 CURSOR FOR SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME like 'test%';

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur1;
    out_loop:LOOP
        FETCH cur1 INTO cur1_username;
        IF done = 1 THEN
            LEAVE out_loop;
        END IF;
        
        OPEN cur2;
        inner_loop:LOOP
        FETCH cur2 INTO cur2_dbname;
        IF done = 1 THEN
            LEAVE inner_loop;
        END IF;
        
             SET @SQLSTR1 = CONCAT('grant select,insert,delete,update on ',cur2_dbname,'.*',' to ','''',cur1_username,'''','@','''%'';') ;
             PREPARE STMT1 FROM @SQLSTR1; 
             EXECUTE STMT1; 
             DEALLOCATE PREPARE STMT1;
        
        end LOOP inner_loop;
        CLOSE cur2;
        SET done=0;
    END LOOP out_loop;
  CLOSE cur1;

END $$
DELIMITER ;

注意:

1.由於mysql在儲存過程當中無法將查詢出來的變數名直接作為表名來用,所以這裡要用到動態拼接SQL的方法,但是通常的SET CONCAT的方法並不管用,所以這裡就使用了PREPARE來進行預編譯。

2.在定義遊標之前所以的定義都只能通過decalre定義,不能使用SET定義!!!!!!

3.定義的變數名不能和表返回的欄位名相同,否則接收的值為空。

總結

 批量處理雖然有時候能提高工作的效率,但是帶來的潛在危險也是挺大了,所以在執行之前必須要非常有把握你執行的語句對資料的影響,否則在生成環境就非常危險了。

備註:

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。

《歡迎交流討論》

相關推薦

MySQL 遊標PREPARE處理語句

概述 本章節介紹使用遊標來批量進行表操作,包括批量新增索引、批量新增欄位等。如果對儲存過程、變數定義、預處理還不是很熟悉先閱讀我前面寫過的關於這三個概念的文章,只有先了解了這三個概念才能更好的理解這篇文章。 正文 游標宣告 宣告游標 DECLARE cur

PREPARE 處理語句轉載

文章來自mysql參考手冊 MySQL 5.1對伺服器一方的預製語句提供支援。如果您使用合適的客戶端程式設計介面,則這種支援可以發揮在MySQL 4.1中實施的高效客戶端/伺服器二進位制協議的優勢。候選介面包括MySQL C API客戶端庫(用於C程式)、MySQL Connector/J(用於Java程式

mysql prepare 處理語句

文章來自mysql參考手冊 MySQL 5.1對伺服器一方的預製語句提供支援。如果您使用合適的客戶端程式設計介面,則這種支援可以發揮在MySQL 4.1中實施的高效客戶端/伺服器二進位制協議的優勢。候選介面包括MySQL C API客戶端庫(用於C程式)、MySQL Connector/J(用於Java程式

Codeforces 147B Smile HouseDP處理 + 倍增

rep 驗證 bool 求一個 png != () long long mile 題目鏈接 Smile House 題意 給定一個$n$個點的有向圖,求一個點數最少的環,使得邊權之和$>0$,這裏的環可以重復經過點和邊。    滿足 $n <= 30

POJ 3669 Meteor Shower BFS+處理

tro ports hid 否則 class fin leaves style 影響 Description Bessie hears that an extraordinary meteor shower is coming; reports say that th

HihoCoder - 1426 What a Ridiculous Election BFS處理

mat pri digi reside them mes des 出現 for Problem E. What a Ridiculous Election Description In country Light Tower, a presidential election

Codeforces Round #435 (Div. 2) E. Mahmoud and Ehab and the function處理+二分

class [1] can 行處理 long 個數 分享 amp abs 題目鏈接:點我點我 題意:公式:,給出n個數,從a[1]到a[n],和m個數(b數組),然後從b數組裏挑出連續的n個數(也就m-n+1中選擇),按公式計算,使得f最小, 還有q次對a數組的操作(某

Topcoder SRM 701 Div2-900 ThueMorseGame博弈+處理

n) const ons ret 一個人 || spa 進制 fin 題意 Alice和Bob在玩一個遊戲,Alice先手。 每次一個人可以從一堆式子中拿走任意數量(不超過m)的式子。 取走最後一顆式子的人勝利。 當一個取完某一步的時候剩下的石子數量的二進制表示中1

HDOJ--3681--Prison BreakBFS處理+狀態壓縮DP

-s cin pos hdoj con 多少 電源 too 最大的 題意 F--起點 S--空格 G--能量池,只能充一次電,充完之後G變為S,也可已選擇不充而當成普通的S D--激光區,不能走 Y--電源開關 M被關在一所監獄之中,F為起點,每走一步(上下左右)消耗1節能

BZOJ 1415 聰聰和可可 Dijkstra處理 + 期望DP + 記憶化搜尋

任重而道遠 Input 資料的第1行為兩個整數N和E,以空格分隔,分別表示森林中的景點數和連線相鄰景點的路的條數。 第2行包含兩個整數C和M,以空格分隔,分別表示初始時聰聰和可可所在的景點的編號。 接下來E行,每行兩個整數,第i+2行的兩個整數Ai和Bi表示景點Ai和景點Bi之間有一條

【2016 ICPC亞洲區域賽北京站 E】What a Ridiculous ElectionBFS處理

Description In country Light Tower, a presidential election is going on. There are two candidates,  Mr. X1 and Mr. X2, and both of them are not

2018.11.06【NOIP2015】【洛谷P2668】鬥地主DP處理搜尋

傳送門 解析: 其實不考慮點數大小的話只有張數對我們是有用的。所以可以預處理出有 i i

【洛谷】 P1019 單詞接龍-處理+dfs

題目描述 單詞接龍是一個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),在兩個單詞相連時,其重合部分合為一部分,例如 beastbeast和astonishastonish,如果接成

ML - 貸款使用者逾期情況分析2 - 特徵工程1資料處理

文章目錄 資料預處理 (判定貸款使用者是否逾期) 1. 刪除無用特徵 2. 資料格式化 - X_date 3. 資料處理 - 類別特徵 X_cate 4. 資料處理 - 其他非數值型特徵 5. 資料處理 - 數值型特徵

What a Ridiculous Election處理bfs

In country Light Tower, a presidential election is going on. There are two candidates, Mr. X1 and Mr. X2, and both of them are not like go

1038A 】Equality 思維水題,處理字串

題幹: You are given a string ss of length nn, which consists only of the first kk letters of the Latin alphabet. All letters in string ss a

C語言程式設計 細節總結第10-11章 檔案、處理命令

第10章 檔案 1.C語言系統把檔案當成一個流,按位元組進行處理 2.檔案按編碼方式分為二進位制檔案和ASCII檔案(文字檔案) 3.用檔案指標標識檔案,開啟檔案可取得該指標 4.對檔案進行操作,開啟->讀寫->關閉 5.檔案開啟方式只有四種:只讀、

2031: Barareh on Fire處理+bfs

 思路: 兩次BFS 一次處理火燒,得到每個點著火的時間,第二次bfs處理人的逃跑。 注意,像這類有多組資料輸入的時候一定要注意初始化條件,比如幾個vis陣列要置零,佇列一定要記得清空。 #include<iostream> #include<cstr

Shuffle處理+暴力

題目大意:有一個播放器用於播放音樂,現在給出s(已有曲目的數量),n給出記錄的長度。播放器有隨機播放的功能,每次生成一個1~s的隨機系列進行播放,當s首歌全部播放完後,重新生成一個播放序列。現在有

CNN英文垃圾郵件分類資料處理

整理自唐宇迪老師的視訊課程,感謝他! 本文最後會貼出所有的原始碼檔案,下文只是針對每個小點貼出程式碼進行註釋說明,可以略過。 1.思路 關於利用CNN做文字分類,其主要思想通過下面這幅圖就能夠一目瞭然。 本文主要記錄了利用CNN來分類英文垃圾郵件的全