MySQL中prepare與execute以及deallocate預處理語句的使用教程

這篇文章主要介紹了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
喜歡就支持一下吧
點贊13 分享