預製語句的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 委託類並用自定義型別替代泛型...