1. 程式人生 > >prepare 預編譯SQL:Mysql

prepare 預編譯SQL:Mysql

預編譯SQL:

SQL程式碼
  1. prepare pstmt from 'select a from table';  



上面這句SQL建立了一個預編譯的SQL。名為pstmt,這個預編譯SQL的存活期就是當前的會話,也就是當前的資料庫連線。
如果連線一斷開 ,那就會消失。

from後面跟的就是要進行編譯的那個SQL,這個值可以是一個字面的字串值 ,就像上面,也可以是一個變數。
比如:

SQL程式碼
  1. set @sql = 'select * from admin';prepare pstmt from @sql;  



from後面跟的只能是字面值或者變數這兩種情況 ,不能直接跟十六進位制的字串。

比如:

SQL程式碼
  1. prepare testhex from 0x73656C656374202A2066726F6D2061;  


這樣是錯誤 的,可以先用變數來接收這個十六進位制串的值,然後再進行SQL的編譯。

SQL程式碼
  1. set @sql = 0x73656C656374202A2066726F6D2061;prepare testhex from @sql;  


這樣就正確了。

注意:被編譯的SQL只能是一條單獨的語句,不能多條語句一起編譯,比如:

SQL程式碼
  1. prepare mutisql from 'select 1;select 2';  


這是錯誤的。

可以被預編譯的SQL語句的

型也是有限制的,並不是所有的SQL都可以被編譯。
下面這些型的SQL是可以編譯的:
create table,delete,do,insert,replace,select,set,update 和多數的show語句。


利用下面的SQL來執行上面的已經編譯好的SQL:
execute pstmt; execute後面直接跟名字就可以執行。。

帶引數的預編譯SQL:

SQL程式碼
  1. prepare pstmt from 'select a from table where id = ?';  



引數用?代替。注意,就算引數的值是一個字串,也不用加引號。加了反而有錯。

在呼叫的時候利用using關鍵字向SQL傳遞引數 。

SQL程式碼
  1. set @value = 1;execute pstmt using @value;  



先宣告一個變數來儲存引數的值,然後通過後面的using @value來傳SQL傳遞引數 。
注意這裡的引數的值只能由變數來傳遞,不能直接寫成execute pstmt using 1; 
這是錯誤的。

多個引數之間用逗號隔開。

刪除預編譯SQL的辦法:

SQL程式碼
  1. drop prepare a;   


a 是預編譯SQL的名字。