理解Mysql prepare預(yù)處理語句
MySQL 5.1對服務(wù)器一方的預(yù)制語句提供支持。如果您使用合適的客戶端編程界面,則這種支持可以發(fā)揮在MySQL 4.1中實(shí)施的高效客戶端/服務(wù)器二進(jìn)制協(xié)議的優(yōu)勢。候選界面包括MySQL C API客戶端庫(用于C程序)、MySQL Connector/J(用于Java程序)和MySQL Connector/NET。例如,C API可以提供一套能組成預(yù)制語句API的函數(shù)調(diào)用。其它語言界面可以對使用了二進(jìn)制協(xié)議(通過在C客戶端庫中鏈接)的預(yù)制語句提供支持。對預(yù)制語句,還有一個SQL界面可以利用。與在整個預(yù)制語句API中使用二進(jìn)制協(xié)議相比,本界面效率沒有那么高,但是它不要求編程,因?yàn)樵赟QL層級,可以直接利用本界面:
· 當(dāng)您無法利用編程界面時,您可以使用本界面。
· 有些程序允許您發(fā)送SQL語句到將被執(zhí)行的服務(wù)器中,比如mysql客戶端程序。您可以從這些程序中使用本界面。
· 即使客戶端正在使用舊版本的客戶端庫,您也可以使用本界面。唯一的要求是,您能夠連接到一個支持預(yù)制語句SQL語法的服務(wù)器上。
預(yù)制語句的SQL語法在以下情況下使用:
· 在編代碼前,您想要測試預(yù)制語句在您的應(yīng)用程序中運(yùn)行得如何?;蛘咭苍S一個應(yīng)用程序在執(zhí)行預(yù)制語句時有問題,您想要確定問題是什么。
· 您想要創(chuàng)建一個測試案例,該案例描述了您使用預(yù)制語句時出現(xiàn)的問題,以便您編制程序錯誤報告。
· 您需要使用預(yù)制語句,但是您無法使用支持預(yù)制語句的編程API。
預(yù)制語句的SQL語法基于三個SQL語句:
PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @var_name] ...]; {DEALLOCATE | DROP} PREPARE stmt_name;
PREPARE語句用于預(yù)備一個語句,并賦予它名稱stmt_name,借此在以后引用該語句。語句名稱對案例不敏感。preparable_stmt可以是一個文字字符串,也可以是一個包含了語句文本的用戶變量。該文本必須展現(xiàn)一個單一的SQL語句,而不是多個語句。使用本語句,‘?'字符可以被用于制作參數(shù),以指示當(dāng)您執(zhí)行查詢時,數(shù)據(jù)值在哪里與查詢結(jié)合在一起?!?#63;'字符不應(yīng)加引號,即使您想要把它們與字符串值結(jié)合在一起,也不要加引號。參數(shù)制作符只能被用于數(shù)據(jù)值應(yīng)該出現(xiàn)的地方,不用于SQL關(guān)鍵詞和標(biāo)識符等。
如果帶有此名稱的預(yù)制語句已經(jīng)存在,則在新的語言被預(yù)備以前,它會被隱含地解除分配。這意味著,如果新語句包含一個錯誤并且不能被預(yù)備,則會返回一個錯誤,并且不存在帶有給定名稱語句。
預(yù)制語句的范圍是客戶端會話。在此會話內(nèi),語句被創(chuàng)建。其它客戶端看不到它。
在預(yù)備了一個語句后,您可使用一個EXECUTE語句(該語句引用了預(yù)制語句名稱)來執(zhí)行它。如果預(yù)制語句包含任何參數(shù)制造符,則您必須提供一個列舉了用戶變量(其中包含要與參數(shù)結(jié)合的值)的USING子句。參數(shù)值只能有用戶變量提供,USING子句必須準(zhǔn)確地指明用戶變量。用戶變量的數(shù)目與語句中的參數(shù)制造符的數(shù)量一樣多。
您可以多次執(zhí)行一個給定的預(yù)制語句,在每次執(zhí)行前,把不同的變量傳遞給它,或把變量設(shè)置為不同的值。
要對一個預(yù)制語句解除分配,需使用DEALLOCATE PREPARE語句。嘗試在解除分配后執(zhí)行一個預(yù)制語句會導(dǎo)致錯誤。
如果您終止了一個客戶端會話,同時沒有對以前已預(yù)制的語句解除分配,則服務(wù)器會自動解除分配。
以下SQL語句可以被用在預(yù)制語句中:CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE和多數(shù)的SHOW語句。目前不支持其它語句。
以下例子顯示了預(yù)備一個語句的兩種方法。該語句用于在給定了兩個邊的長度時,計算三角形的斜邊。
第一個例子顯示如何通過使用文字字符串來創(chuàng)建一個預(yù)制語句,以提供語句的文本:
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> SET @a = 3; mysql> SET @b = 4; mysql> EXECUTE stmt1 USING @a, @b; +------------+ | hypotenuse | +------------+ | 5 | +------------+ mysql> DEALLOCATE PREPARE stmt1;
第二個例子是相似的,不同的是提供了語句的文本,作為一個用戶變量:
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> PREPARE stmt2 FROM @s; mysql> SET @a = 6; mysql> SET @b = 8; mysql> EXECUTE stmt2 USING @a, @b; +------------+ | hypotenuse | +------------+ | 10 | +------------+ mysql> DEALLOCATE PREPARE stmt2;
對于已預(yù)備的語句,您可以使用位置保持符。以下語句將從tb1表中返回一行:
mysql> SET @a=1; mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?"; mysql> EXECUTE STMT USING @a;
以下語句將從tb1表中返回第二到第六行:
mysql> SET @skip=1; SET @numrows=5; mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?"; mysql> EXECUTE STMT USING @skip, @numrows;
預(yù)制語句的SQL語法不能被用于帶嵌套的風(fēng)格中。也就是說,被傳遞給PREPARE的語句本身不能是一個PREPARE, EXECUTE或DEALLOCATE PREPARE語句。
預(yù)制語句的SQL語法與使用預(yù)制語句API調(diào)用不同。例如,您不能使用mysql_stmt_prepare() C API函數(shù)來預(yù)備一個PREPARE, EXECUTE或DEALLOCATE PREPARE語句。
預(yù)制語句的SQL語法可以在已存儲的過程中使用,但是不能在已存儲的函數(shù)或觸發(fā)程序中使用。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
- MySQL?SQL預(yù)處理(Prepared)的語法實(shí)例與注意事項(xiàng)
- Mysql prepare預(yù)處理的具體使用
- MySQL中預(yù)處理語句prepare、execute與deallocate的使用教程
- php+mysqli預(yù)處理技術(shù)實(shí)現(xiàn)添加、修改及刪除多條數(shù)據(jù)的方法
- php+mysqli使用預(yù)處理技術(shù)進(jìn)行數(shù)據(jù)庫查詢的方法
- PHP mysqli擴(kuò)展庫 預(yù)處理技術(shù)的使用分析
- mysqli預(yù)處理編譯的深入理解
- MySQL中Stmt 預(yù)處理提高效率問題的小研究
- Go?連接?MySQL之?MySQL?預(yù)處理詳解
相關(guān)文章
mysql如何實(shí)現(xiàn)多行查詢結(jié)果合并成一行
利用函數(shù):group_concat(),實(shí)現(xiàn)一個ID對應(yīng)多個名稱時,原本為多行數(shù)據(jù),把名稱合并成一行2013-12-12關(guān)于useSSL=false和true的區(qū)別及說明
這篇文章主要介紹了關(guān)于useSSL=false和true的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08解析MYSQL 數(shù)據(jù)庫導(dǎo)入SQL 文件出現(xiàn)亂碼的問題
本篇文章是對MYSQL數(shù)據(jù)庫導(dǎo)入SQL文件出現(xiàn)亂碼的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06mysql中union和union?all的使用及注意事項(xiàng)
這篇文章主要給大家介紹了關(guān)于mysql中union和union?all的使用及注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下2022-08-08MySQL觸發(fā)器運(yùn)用于遷移和同步數(shù)據(jù)的實(shí)例教程
這篇文章主要介紹了MySQL觸發(fā)器運(yùn)用于遷移和同步數(shù)據(jù)的實(shí)例教程,分別是SQL Server數(shù)據(jù)遷移至MySQL以及同步備份數(shù)據(jù)表記錄的兩個例子,需要的朋友可以參考下2015-12-12Mysql中實(shí)現(xiàn)提取字符串中的數(shù)字的自定義函數(shù)分享
這篇文章主要介紹了Mysql中實(shí)現(xiàn)提取字符串中的數(shù)字的自定義函數(shù)分享,通常這種問題是在編程語言中實(shí)現(xiàn),本文使用自定義SQL函數(shù)實(shí)現(xiàn),需要的朋友可以參考下2014-10-10MYSQL安裝時解決要輸入current root password的解決方法
在裝MYSQL的時候發(fā)現(xiàn)要輸入current root password不記得以前在電腦里裝過(你的系統(tǒng)曾經(jīng)裝過MYSQL在重裝就會要求輸入原來設(shè)定的密碼,如果是第一次安裝就不會出現(xiàn)),在網(wǎng)上苦苦搜尋解決方法。2011-07-07查看修改mysql編碼方式讓它支持中文(gbk或者utf8)
MySQL的默認(rèn)編碼是Latin1,不支持中文,要支持中文需要把數(shù)據(jù)庫的默認(rèn)編碼修改為gbk或者utf8,真的是很麻煩啊,不過本文提供了詳細(xì)的修改教程,感興趣的你可不要走開啊,希望本文對你有所幫助2013-01-01