MySql動態SQL

來源:互聯網
上載者:User
13.7. 用於預先處理語句的SQL文法

MySQL 5.1對伺服器一方的預製語句提供支援。如果您使用合適的用戶端編程介面,則這種支援可以發揮在MySQL 4.1中實施的高效用戶端/伺服器二進位協議的優勢。候選介面包括MySQL C API用戶端庫(用於C程式)、MySQL Connector/J(用於Java程式)和MySQL Connector/NET。例如,C API可以提供一套能組成預製語句API的函數調用。請參見25.2.4節,“C API預先處理語句”。其它語言介面可以對使用了二進位協議(通過在C用戶端庫中連結)的預製語句提供支援。有一個例子是PHP 5.0中的mysqli擴充。

對預製語句,還有一個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;

預製語句的SQL文法不能被用於帶嵌套的風格中。也就是說,被傳遞給PREPARE的語句本身不能是一個PREPARE, EXECUTE或DEALLOCATE PREPARE語句。

預製語句的SQL文法與使用預製語句API調用不同。例如,您不能使用mysql_stmt_prepare() C API函數來預備一個PREPARE, EXECUTE或DEALLOCATE PREPARE語句。

預製語句的SQL文法可以在已儲存的過程中使用,但是不能在已儲存的函數或觸發程式中使用。

當使用預製語句時,可以在LIMIT子句中使用預留位置。請參見13.2.7節,“SELECT文法”。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.