mysql 預處理語句 in MySQL預處理語句

2021-10-17 22:06:22 字數 2533 閱讀 7920

預製語句的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...