MySQL中prepare、execute與deallocate的用法詳解

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)推薦:

mysql教程

mysql教程

mysql教程

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享
站長(zhǎng)的頭像-小浪學(xué)習(xí)網(wǎng)月度會(huì)員