1. 程式人生 > >MySQL數據庫存儲過程動態表建立(PREPARE)

MySQL數據庫存儲過程動態表建立(PREPARE)

不存在 arc create mit dea gps var keyword posit

  1. PREPARE statement_name FROM sql_text /*定義*/
  2. EXECUTE statement_name [USING variable [,variable...]] /*運行預處理語句*/
  3. 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 開始,它能夠被用於存儲過程,仍不支持在函數中使用!

MySQL數據庫存儲過程動態表建立(PREPARE)