prepare 預編譯SQL:Mysql
阿新 • • 發佈:2019-02-06
預編譯SQL:
SQL程式碼- prepare pstmt from 'select a from table';
上面這句SQL建立了一個預編譯的SQL。名為pstmt,這個預編譯SQL的存活期就是當前的會話,也就是當前的資料庫連線。
如果連線一斷開 ,那就會消失。
from後面跟的就是要進行編譯的那個SQL,這個值可以是一個字面的字串值 ,就像上面,也可以是一個變數。
比如:
- set @sql = 'select * from admin';prepare pstmt from @sql;
from後面跟的只能是字面值或者變數這兩種情況 ,不能直接跟十六進位制的字串。
比如:
- prepare testhex from 0x73656C656374202A2066726F6D2061;
這樣是錯誤 的,可以先用變數來接收這個十六進位制串的值,然後再進行SQL的編譯。
- set @sql = 0x73656C656374202A2066726F6D2061;prepare testhex from @sql;
這樣就正確了。
注意:被編譯的SQL只能是一條單獨的語句,不能多條語句一起編譯,比如:
- prepare mutisql from 'select 1;select 2';
這是錯誤的。
可以被預編譯的SQL語句的類
下面這些類型的SQL是可以編譯的:
create table,delete,do,insert,replace,select,set,update 和多數的show語句。
利用下面的SQL來執行上面的已經編譯好的SQL:
execute pstmt; execute後面直接跟名字就可以執行。。
帶引數的預編譯SQL: SQL程式碼
- prepare pstmt from 'select a from table where id = ?';
引數用?代替。注意,就算引數的值是一個字串,也不用加引號。加了反而有錯。
在呼叫的時候利用using關鍵字向SQL傳遞引數 。
- set @value = 1;execute pstmt using @value;
先宣告一個變數來儲存引數的值,然後通過後面的using @value來傳SQL傳遞引數 。
注意這裡的引數的值只能由變數來傳遞,不能直接寫成execute pstmt using 1;
這是錯誤的。
多個引數之間用逗號隔開。
刪除預編譯SQL的辦法:
- drop prepare a;
a 是預編譯SQL的名字。