標籤:val select 術語 ret iter cal 獨立 sele let
https://zhuanlan.zhihu.com/p/23423264
預存程序-官方解釋:
是sql語句和控制語句的先行編譯集合。以一個名稱儲存並作為一個單元處理。
預存程序-直白的說:
把需要的命令先行編譯好。存到資料庫。只在第一次的時候需要編譯,儲存後,以後使用的時候用戶端直接(傳參)調用。各種省事。
優點:
增強sql語句的功能性和靈活性實現較快的執行速度減少網路流量【因為往資料庫傳遞的參數少了。所以請求少了】
怎麼使用:
A、首先需要DELIMITER 語句來修改定界符B、然後建立預存程序【CREATE PROCUDURE】過程體中可以用 in 和 out 傳參。C、通過CALL來調用
為什麼使用DELITIMITER 修改定界符?
mysql預設以分號作為sql語句的結束來進行執行,當我們在建立預存程序時,為
了不讓完整的預存程序語句由於分號而提前執行,需要臨時規定以//或者$$來作
為結束符號。這樣的話,建立預存程序時,中間的分號會被忽略,直到遇到//符
號才執行語句。
注意:
A、因為預存程序的 過程體不可修改,所以設定錯誤後,一般都是刪除後,重新建立。B、設定的參數,不要和表中的欄位名字相同。DROP PROCEDURE 名字; 刪除命令
舉例:【帶有一個參數的預存程序 IN】
@var int p_id 關聯iddelimiter // 重新定義定界符create procedure removeUserId(IN p_id INT UNSIGNED)BEGINDELETE FROM users where id = p_id;END//delitimer ; 這裡是把定界符在修改回來CALL removeUserId(3); 調用
舉例:【帶有IN 和 OUT型別參數的預存程序】
@var int p_id 關聯id@var int userNums 刪除後剩下的條數DELITIMER //CRTEATE PROCEDURE removeAndReturnUserNums(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED) 這裡設定了兩個參數BEGINDELETE FROM users WHERE id = p_id;SELECT COUNT(id) FROM USERS INTO userNums;END//DELITIMER ;CALL removeAndRrturnUserNums(27,@nums) //這裡的@ 是使用者變數。下面是總結注意:mysql變數的術語分類:A.使用者變數:以"@"開始,形式為"@變數名"使用者變數跟mysql用戶端是綁定的,設定的變數,只對目前使用者使用的用戶端生效B、全域變數:定義時,以如下兩種形式出現,set GLOBAL 變數名 或者 set @@global.變數名 對所有用戶端生效。只有具有super許可權才可以設定全域變數
認識一個系統函數:row_count()
row_count(); 得到操作行數。(單獨用沒用)例子:插入資料INSERT test(username) VALUES(‘A‘),(‘B‘),(‘C‘); SELECT ROW_COUNT(); //返回被插入的記錄總數 結果為3
舉例:【帶有多個 OUT型別參數的預存程序】
@var SMALLINT p_age 關聯p_age@var SMALLINT deleteUsers 刪除總條數@var SMALLINT userCounts 剩餘總條數DELIMITER //CREATE PROCEDURE rmUserByAgeAndRtInfos(IN p_age SMALLINT UNSIGNED, OUT deleteUsers SMALLINT UNSIGNED, OUT userCounts SMALLINT UNSIGNED)BEGINDELETE FROM users WHERE WHERE age = p_age; //刪除條件SELECT ROW_COUNT() INTO deleteUsers;//返回剛刪的記錄SELECT COUNT(id) from users INTO userCounts;//得到剩餘的ID數END//DELIMITER ;CALL rmUserByAgeAndRtInfos(23, @a, @b);SELECT @a, @b;
總結:
預存程序一般都是實現複雜一些的功能預存程序一般獨立來執行。預存程序常常針對錶操作。根據需要定製預存程序。
預存程序--mysql