這篇文章主要介紹了mysql中預處理語句prepare、execute與deallocate的使用教程,需要的朋友可以參考下
MySQL官方將prepare、execute、deallocate統(tǒng)稱為PREPARE STATEMENT。
我習慣稱其為【預處理語句】。
其用法十分簡單,
PREPARE?stmt_name?FROM?preparable_stmt EXECUTE?stmt_name ??[USING?@var_name?[,?@var_name]?...]??- {DEALLOCATE?|?DROP}?PREPARE?stmt_name
舉個栗子:
mysql>?PREPARE?pr1?FROM?'SELECT??+?'; Query?OK,?0?rows?affected?(0.01?sec) Statement?prepared mysql>?SET?@a=1,?@b=10?; Query?OK,?0?rows?affected?(0.00?sec) mysql>?EXECUTE?pr1?USING?@a,?@b; +------+ |??+??| +------+ |?11??| +------+ 1?row?in?set?(0.00?sec) mysql>?EXECUTE?pr1?USING?1,?2;??--?只能使用用戶變量傳遞。 ERROR?1064?(42000):?You?have?an?error?in?your?SQL?syntax;?check?the?manual?that?corresponds?to?your?MySQL?server?version?for?the? right?syntax?to?use?near?'1,?2'?at?line?1 mysql>?DEALLOCATE?PREPARE?pr1; Query?OK,?0?rows?affected?(0.00?sec)
使用PAREPARE STATEMENT可以減少每次執(zhí)行SQL的語法分析,
比如用于執(zhí)行帶有WHERE條件的SELECT和DELETE,或者UPDATE,或者INSERT,只需要每次修改變量值即可。
同樣可以防止sql注入,參數值可以包含轉義符和定界符。
適用在應用程序中,或者SQL腳本中均可。
更多用法:
同樣PREPARE … FROM可以直接接用戶變量:
mysql>?CREATE?TABLE?a?(a?int); Query?OK,?0?rows?affected?(0.26?sec) mysql>?INSERT?INTO?a?SELECT?1; Query?OK,?1?row?affected?(0.04?sec) Records:?1?Duplicates:?0?Warnings:?0 mysql>?INSERT?INTO?a?SELECT?2; Query?OK,?1?row?affected?(0.04?sec) Records:?1?Duplicates:?0?Warnings:?0 mysql>?INSERT?INTO?a?SELECT?3; Query?OK,?1?row?affected?(0.04?sec) Records:?1?Duplicates:?0?Warnings:?0 mysql>?SET?@select_test?=?CONCAT('SELECT?*?FROM?',?@table_name); Query?OK,?0?rows?affected?(0.00?sec) mysql>?SET?@table_name?=?'a'; Query?OK,?0?rows?affected?(0.00?sec) mysql>?PREPARE?pr2?FROM?@select_test; Query?OK,?0?rows?affected?(0.00?sec) Statement?prepared mysql>?EXECUTE?pr2?; +------+ |?a??| +------+ |?1??| |?2??| |?3??| +------+ 3?rows?in?set?(0.00?sec) mysql>?DROP?PREPARE?pr2;??--?此處DROP可以替代DEALLOCATE Query?OK,?0?rows?affected?(0.00?sec)
每一次執(zhí)行完EXECUTE時,養(yǎng)成好習慣,須執(zhí)行DEALLOCATE PREPARE … 語句,這樣可以釋放執(zhí)行中使用的所有數據庫資源(如游標)。
不僅如此,如果一個session的預處理語句過多,可能會達到max_prepared_stmt_count的上限值。
預處理語句只能在創(chuàng)建者的會話中可以使用,其他會話是無法使用的。
而且在任意方式(正?;蚍钦#┩顺鰰挄r,之前定義好的預處理語句將不復存在。
如果在存儲過程中使用,如果不在過程中DEALLOCATE掉,在存儲過程結束之后,該預處理語句仍然會有效。
總結
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END