mysql sp 練習遊標和預編譯
阿新 • • 發佈:2018-07-28
prepare book from oop hand locate exist ont alloc
create procedure Jack_count_cur_dual() BEGIN DECLARE tb_name VARCHAR(50); DECLARE done int DEFAULT 0; DECLARE mycur CURSOR for SELECT table_name FROM tt_countrows; DECLARE CONTINUE HANDLER FOR NOT FOUND set done = 1; DROP TABLE IF EXISTS tt_countrows;#刪除,創建臨時表 CREATE TEMPORARY TABLE tt_countrows( table_namevarchar(50), table_count int ); INSERT into tt_countrows(table_name)#向臨時表中插入表名數據 select ‘autidor‘ UNION SELECT ‘spprogram.books‘ UNION SELECT ‘information_schema.files‘; ; OPEN mycur; myloop:LOOP FETCH mycur into tb_name;#使用遊標讀取數據賦值給tb_name,得到表名 if done = 1 THEN leave myLoop; end if; set @v_sql= CONCAT(‘select count(*) into @v_count from ‘,tb_name);#預編譯查詢表中數據數量的語句 PREPARE stmt FROM @v_sql; EXECUTE stmt; UPDATE tt_countrows SET table_count = @v_count #修改臨時表中table_count字段,值為預編譯語句中的count值 WHERE table_name = tb_name; DEALLOCATE PREPARE stmt; END LOOP myloop; CLOSE mycur; SELECT * FROM tt_countrows;#輸出臨時表結果並刪除臨時表DROP TABLE tt_countrows; END
問題一:首先,在mysql中的變量分為四類,分別是:
用戶變量:以"@"開始,形式為"@變量名"
用戶變量跟mysql客戶端是綁定的,設置的變量,只對當前用戶使用的客戶端生效
全局變量:定義時,以如下兩種形式出現,set GLOBAL 變量名 或者 set @@global.變量名對所有客戶端生效。只有具有super權限才可以設置全局變量
會話變量:只對連接的客戶端有效。
局部變量:作用範圍在begin到end語句塊之間。在該語句塊裏設置的變量
declare語句專門用於定義局部變量。set語句是設置不同類型的變量,包括會話變量和全局變量。
在存儲過程中定義了prepare語句然後EXECUTE,它不能接收在存儲過程中定義的局部變量,而只能接受帶@的用戶變量。
這是MYSQL設計上所決定的。 PREPARE, EXCEUTE其實已經可以說是在另外一個棧上執行,不屬於當前存儲過程了。
問題二:存儲過程需要獲取數據庫表名和表中數據數量,數據庫表名需要從information_schema數據庫下的tables中尋找,而表中數據數量需要利用count()到對應的表中統計。參考相關資料,利用遊標實現tablename的查找,利用prepare實現quantity的統計。再通過創建臨時表顯示結果。
mysql sp 練習遊標和預編譯