mysql的預定義語句 MySQL預處理語句

2021-10-17 11:29:18 字數 2533 閱讀 7929

預製語句的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 開始,它可以被用於儲存過程,仍不支援在函式或觸發器中使用!

PHP中的預定義常量 預定義變數 魔術常量

php中的預定義常量 預定義變數 魔術常量 1 預定義常量 核心預定義常量 是在php的核心中就定義好了的常量。區分大小寫。php version 內建常量,php程式的版本,如3.0.8 dev php os 內建常量,執行php解析器的作業系統名稱,如windows。php eol 系統換行符,...

svg svg預定義的形狀

svg 有一些預定義的形狀元素,可被開發者使用和操作 矩形 圓形 橢圓 線 折線 多邊形 路徑標籤用來定義路徑。下面的命令可用於路徑資料 m moveto l lineto h horizontal lineto v vertical lineto c curveto s smooth curvet...

EventHandler,預定義的委託

eventhandler 是乙個預定義的委託 專用於表示不生成資料的事件的事件處理程式方法。如果事件生成資料,則必須提供自己的自定義事件資料型別,並且必須要麼建立乙個委託,其中第二個引數的型別為自定義型別,要麼使用泛型eventhandler of teventargs 委託類並用自定義型別替代泛型...