預製語句的SQL語法基於三個SQL語句:html
PREPARE stmt_name FROM preparable_stmt;mysql
EXECUTE stmt_name [USING @var_name [, @var_name] ...];sql
{DEALLOCATE | DROP} PREPARE stmt_name;數據庫
PREPARE語句用於預備一個語句,並賦予它名稱stmt_name,藉此在之後引用該語句。服務器
預編譯SQL的存活期就是當前的會話,也就是當前的數據庫鏈接。若是鏈接一斷開 ,那就會消失。函數
例:spa
mysql> desc tb;htm
+-------+------------------+------+-----+---------+----------------+資源
| Field | Type | Null | Key | Default | Extra |作用域
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| Name | char(20) | NO | | NULL | |
| Age | tinyint(4) | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+
3 rows in set (0.08 sec)
mysql> PREPARE prod FROM "INSERT INTO tb VALUES(?,?,?)";
Query OK, 0 rows affected (0.58 sec)
Statement prepared
mysql> PREPARE prod FROM "INSERT INTO tb(name,age) VALUES(?,?)";
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> set @p='tejevo';
Query OK, 0 rows affected (0.06 sec)
mysql> set @q=20;
Query OK, 0 rows affected (0.00 sec)
mysql> execute prod using @p, @q;
Query OK, 1 row affected (0.05 sec)
mysql> select * from tb;
+----+--------+-----+
| id | Name | Age |
+----+--------+-----+
| 1 | tejevo | 20 |
+----+--------+-----+
1 row in set (0.00 sec)
mysql> deallocate prepare prod;
說明:from後面跟的就是要進行編譯的那個SQL,這個值能夠是一個字面的字符串值 ,就像上面,也能夠是一個變量。好比:
set @sql = 'select * from tb';
prepare pstmt from @sql;
from後面跟的只能是字面值或者變量這兩種狀況 ,不能直接跟十六進制的字符串。
被編譯的SQL只能是一條單獨的語句,不能多條語句一塊兒編譯,好比:
prepare mutisql from 'select 1;select 2'; --- 這是錯誤的
調用的時候利用using關鍵字向SQL傳遞參數 。
set @value = 1;execute pstmt using @value;
先聲明一個變量來保存參數的值,而後經過後面的using @value來傳SQL傳遞參數 。
注意這裏的參數的值只能由變量來傳遞,不能直接寫成execute pstmt using 1; 這是錯誤的。
多個參數之間用逗號隔開。
使用 PREPARE 的幾個注意點:
A: PREPARE stmt_name FROM preparable_stmt; 預約義一個語句,並將它賦給 stmt_name ,stmt_name 是不區分大小寫的。
B:參數用?代替。即便 preparable_stmt 語句中的 ? 所表明的是一個字符串,你也不須要將 ? 用引號包含起來。
C: 若是新的 PREPARE 語句使用了一個已存在的 stmt_name ,那麼原有的將被當即釋放!即便這個新的 PREPARE 語句由於錯誤而不能被正確執行。
D: PREPARE stmt_name 的做用域是當前客戶端鏈接會話可見。
E: 要釋放一個預約義語句的資源,能夠使用 DEALLOCATE PREPARE 句法。
F: EXECUTE stmt_name 句法中,若是 stmt_name 不存在,將會引起一個錯誤。
G: 若是在終止客戶端鏈接會話時,沒有顯式地調用 DEALLOCATE PREPARE 句法釋放資源,服務器端會本身動釋放它。
H:能夠被預編譯的SQL語句的類型也是有限制的,並非全部的SQL均可以被編譯。在預約義語句中,CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支持。
I:PREPARE 語句不能夠用於存儲過程(5.0以上能夠使用),自定義函數!但從 MySQL 5.0.13 開始,它能夠被用於存儲過程,仍不支持在函數或觸發器中使用!
更詳細見官方文檔:13.7. 用於預處理語句的SQL語法