懂得Mysql prepare預處置語句。本站提示廣大學習愛好者:(懂得Mysql prepare預處置語句)文章只能為提供參考,不一定能成為您想要的結果。以下是懂得Mysql prepare預處置語句正文
MySQL 5.1對辦事器一方的預制語句供給支撐。假如您應用適合的客戶端編程界面,則這類支撐可以施展在MySQL 4.1中實行的高效客戶端/辦事器二進制協定的優勢。候選界面包含MySQL C API客戶端庫(用於C法式)、MySQL Connector/J(用於Java法式)和MySQL Connector/NET。例如,C API可以供給一套能構成預制語句API的函數挪用。其它說話界面可以對應用了二進制協定(經由過程在C客戶端庫中鏈接)的預制語句供給支撐。對預制語句,還有一個SQL界面可以應用。與在全部預制語句API中應用二進制協定比擬,本界面效力沒有那末高,然則它不請求編程,由於在SQL層級,可以直接應用本界面:
· 當您沒法應用編程界面時,您可使用本界面。
· 有些法式許可您發送SQL語句到將被履行的辦事器中,好比mysql客戶端法式。您可以從這些法式中應用本界面。
· 即便客戶正直在應用舊版本的客戶端庫,您也能夠應用本界面。獨一的請求是,您可以或許銜接到一個支撐預制語句SQL語法的辦事器上。
預制語句的SQL語法在以下情形下應用:
· 在編代碼前,您想要測試預制語句在您的運用法式中運轉得若何。或許或許一個運用法式在履行預制語句時有成績,您想要肯定成績是甚麼。
· 您想要創立一個測試案例,該案例描寫了您應用預制語句時湧現的成績,以便您編制法式毛病申報。
· 您須要應用預制語句,然則您沒法應用支撐預制語句的編程API。
預制語句的SQL語法基於三個SQL語句:
PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @var_name] ...]; {DEALLOCATE | DROP} PREPARE stmt_name;
PREPARE語句用於准備一個語句,並付與它稱號stmt_name,借此在今後援用該語句。語句稱號對案例不敏感。preparable_stmt可所以一個文字字符串,也能夠是一個包括了語句文本的用戶變量。該文本必需展示一個單一的SQL語句,而不是多個語句。應用本語句,‘?'字符可以被用於制造參數,以指導當您履行查詢時,數據值在哪裡與查詢聯合在一路。‘?'字符不該加引號,即便您想要把它們與字符串值聯合在一路,也不要加引號。參數制造符只能被用於數據值應當湧現的處所,不消於SQL症結詞和標識符等。
假如帶有此稱號的預制語句曾經存在,則在新的說話被准備之前,它會被隱含地消除分派。這意味著,假如新語句包括一個毛病而且不克不及被准備,則會前往一個毛病,而且不存在帶有給命名稱語句。
預制語句的規模是客戶端會話。在此會話內,語句被創立。其它客戶端看不到它。
在准備了一個語句後,您可以使用一個EXECUTE語句(該語句援用了預制語句稱號)來履行它。假如預制語句包括任何參數制作符,則您必需供給一個羅列了用戶變量(個中包括要與參數聯合的值)的USING子句。參數值只能有效戶變量供給,USING子句必需精確地指明用戶變量。用戶變量的數量與語句中的參數制作符的數目一樣多。
您可以屢次履行一個給定的預制語句,在每次履行前,把分歧的變量傳遞給它,或把變量設置為分歧的值。
要對一個預制語句消除分派,需應用DEALLOCATE PREPARE語句。測驗考試在消除分派後履行一個預制語句會招致毛病。
假如您終止了一個客戶端會話,同時沒有對之前已預制的語句消除分派,則辦事器會主動消除分派。
以下SQL語句可以被用在預制語句中:CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE和多半的SHOW語句。今朝不支撐其它語句。
以下例子顯示了准備一個語句的兩種辦法。該語句用於在給定了兩個邊的長度時,盤算三角形的斜邊。
第一個例子顯示若何經由過程應用文字字符串來創立一個預制語句,以供給語句的文本:
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;
關於已准備的語句,您可使用地位堅持符。以下語句將從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;
預制語句的SQL語法不克不及被用於帶嵌套的作風中。也就是說,被傳遞給PREPARE的語句自己不克不及是一個PREPARE, EXECUTE或DEALLOCATE PREPARE語句。
預制語句的SQL語法與應用預制語句API挪用分歧。例如,您不克不及應用mysql_stmt_prepare() C API函數來准備一個PREPARE, EXECUTE或DEALLOCATE PREPARE語句。
預制語句的SQL語法可以在已存儲的進程中應用,然則不克不及在已存儲的函數或觸發法式中應用。
以上就是本文的全體內容,願望對年夜家的進修有所贊助。