1. 程式人生 > >mysql sp 練習遊標和預編譯

mysql sp 練習遊標和預編譯

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_name 
varchar(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 練習遊標和預編譯