- PREPARE statement_name FROM sql_text /*定義*/
- EXECUTE statement_name [USING variable [,variable...]] /*運行預處理語句*/
- DEALLOCATE PREPARE statement_name /*刪除定義*/
這是我項目其中用到的,用作參考使用:
DELIMITER $$ DROP PROCEDURE IF EXISTS `gpsdata`.`sp_test`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_test`( gpstime_ varchar(128), gpsname_ varchar(128), gpsinfo_ varchar(256) ) BEGIN DECLARE tbname varchar(50) DEFAULT '0'; DECLARE v_sql varchar(1024) DEFAULT '0'; SET v_sql=CONCAT('select * from ', tbname ,' where gpsname = ',gpsname_,' order by gpstime desc limit 1'); SET @lastdata = v_sql; PREPARE lastdata FROM @lastdata; EXECUTE lastdata; DEALLOCATE PREPARE lastdata; select v_sql; END$$ DELIMITER ;
使用 PREPARE 的幾個注意點:
A: PREPARE stmt_name FROM preparable_stmt;
提前定義一個語句,並將它賦給 stmt_name ,stmt_name 是不區分大寫和小寫的。
B: 即使 preparable_stmt 語句中的 ? 所代表的是一個字符串,你也不須要將 ? 用引號包括起來。
C: 假設新的 PREPARE 語句使用了一個已存在的 stmt_name ,那么原有的將被馬上釋放!
即使這個新的 PREPARE 語句由於錯誤而不能被正確運行。
D: PREPARE stmt_name 的作用域是當前client連接會話可見。
E: 要釋放一個提前定義語句的資源,能夠使用 DEALLOCATE PREPARE 句法。
F: EXECUTE stmt_name 句法中,假設 stmt_name 不存在。將會引發一個錯誤。
G: 假設在終止client連接會話時。沒有顯式地調用 DEALLOCATE PREPARE 句法釋放資源,server端會自己動釋放它。
H:在提前定義語句中。CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支持。
I:PREPARE 語句不能夠用於存儲過程(5.0以上能夠使用),自己定義函數!
但從 MySQL 5.0.13 開始,它能夠被用於存儲過程,仍不支持在函數中使用!