prepare、execute與deallocate都是mysql中的預(yù)處理語(yǔ)句,本文主要介紹了MySQL中預(yù)處理語(yǔ)句prepare、execute與deallocate的使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
相關(guān)mysql視頻教程推薦:《mysql教程》
前言
MySQL官方將prepare、execute、deallocate統(tǒng)稱為PREPARE STATEMENT,我習(xí)慣稱其為【預(yù)處理語(yǔ)句】,其用法十分簡(jiǎn)單,下面話不多說(shuō),來(lái)一起看看詳細(xì)的介紹吧。
示例代碼
PREPARE?stmt_name?FROM?preparable_stmt EXECUTE?stmt_name ?[USING?@var_name?[,?@var_name]?...]?- {DEALLOCATE?|?DROP}?PREPARE?stmt_name
舉個(gè)栗子:
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的語(yǔ)法分析,比如用于執(zhí)行帶有WHERE條件的SELECT和DELETE,或者UPDATE,或者INSERT,只需要每次修改變量值即可。
同樣可以防止sql注入,參數(shù)值可以包含轉(zhuǎn)義符和定界符。
適用在應(yīng)用程序中,或者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時(shí),養(yǎng)成好習(xí)慣,須執(zhí)行DEALLOCATE PREPARE … 語(yǔ)句,這樣可以釋放執(zhí)行中使用的所有數(shù)據(jù)庫(kù)資源(如游標(biāo))。
不僅如此,如果一個(gè)session的預(yù)處理語(yǔ)句過(guò)多,可能會(huì)達(dá)到max_prepared_stmt_count的上限值。
預(yù)處理語(yǔ)句只能在創(chuàng)建者的會(huì)話中可以使用,其他會(huì)話是無(wú)法使用的。
而且在任意方式(正常或非正常)退出會(huì)話時(shí),之前定義好的預(yù)處理語(yǔ)句將不復(fù)存在。
如果在存儲(chǔ)過(guò)程中使用,如果不在過(guò)程中DEALLOCATE掉,在存儲(chǔ)過(guò)程結(jié)束之后,該預(yù)處理語(yǔ)句仍然會(huì)有效。
相關(guān)推薦: