預製語句的sql語法基於三個sql語句:
prepare stmt_name from preparable_stmt;
execute stmt_name [using @var_name [, @var_name] ...];
prepare stmt_name;
prepare語句用於預備乙個語句,並賦予它名稱stmt_name,藉此在以後引用該語句。
預編譯sql的存活期就是當前的會話,也就是當前的資料庫連線。如果連線一斷開 ,那就會消失。
例:mysql> desc tb;
| 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 開始,它可以被用於儲存過程,仍不支援在函式或觸發器中使用!
mysql預處理語句 MYSQL 預處理語句
一 預處理語句介紹 mysql支援服務端預處理語句,預處理語句利用高效的客戶端 服務端二進位制協議。用佔位符替換引數值的預處理語句有下列兩個好處 每次執行語句時,解析語句的開銷更小。通常,資料庫應用程式會處理大量相似的語句,只在子句中更改文字或變數值,比如查詢和刪除的where子句,更新的updat...
MySQL預處理語句
解決問題思路 在mysql中是不允許使用變數作為欄位名的。但是我們可以通過將變數作為字串,新增到一句完整的查詢語句中。這個語句作為乙個字串,可以使用sql預處理語句使用。然後,execute這個預處理語句。示例 將 xx1 作為欄位名,查詢 speed n 注意 如果語句中有varchar型別值,需...
MySQL使用者變數 預處理語句 動態語句用法
預製語句的sql語法基於三個sql語句 prepare stmt name from preparable stmt execute stmt name using var name var name prepare stmt name 表結構 table tab1 columns idbigint...