2016-10-10 76 views
0

我正在嘗試爲表名稱創建一個動態存儲過程,我的意思是當我使用表名稱作爲參數調用存儲過程時,它應該顯示給定表名稱的所有詳細信息。在僅用表名稱的mysql中創建動態存儲過程

我使用這個代碼: -

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40)) 
BEGIN 
SET @t1 =CONCAT("SELECT * FROM '",tab_name,"' "); 
PREPARE stmt3 FROM @t1; 
EXECUTE stmt3; 
DEALLOCATE PREPARE stmt3; 
END 

它顯示錯誤,錯誤是: -

MySQL表示:文件

1064 - 你有一個錯誤的SQL語法;檢查對應於您的MySQL服務器版本的手冊,以便在第3行使用正確的語法

任何人都可以幫助我。

回答

1

反標記環繞表名稱。

DROP PROCEDURE IF EXISTS `test1`; 
DELIMITER $$ 
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40)) 
BEGIN 
    SET @t1 =CONCAT("SELECT * FROM `",tab_name,"`"); -- back-ticks around tbl name 
    PREPARE stmt3 FROM @t1; 
    EXECUTE stmt3; 
    DEALLOCATE PREPARE stmt3; 
END$$ 
DELIMITER ; 

或(phpMyAdmin界面,或者那些不需要分隔符):

DROP PROCEDURE IF EXISTS `test1`; 
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40)) 
BEGIN 
    SET @t1 =CONCAT("SELECT * FROM `",tab_name,"`"); -- back-ticks around tbl name 
    PREPARE stmt3 FROM @t1; 
    EXECUTE stmt3; 
    DEALLOCATE PREPARE stmt3; 
END 

希望你會因爲它看起來微不足道,將不僅僅是調用select慢做一些與此存儲過程不同。

+0

謝謝德魯 我改變了一些由你給出的代碼,它正常工作。 再次感謝您的幫助 我正在使用 CREATE PROCEDURE'test1'(IN'tab_name' VARCHAR(40))NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER BEGIN SET @ t1 = CONCAT(「SELECT * FROM'」,tab_name,「 '「);從@ t1準備stmt3;執行stmt3; DEALLOCATE PREPARE stmt3; END –

+0

很酷。很高興聽到Kunwar的消息。 – Drew

+0

是的,我知道你的意思。備註在評論中被誤傳。人們需要像轉義序列那樣來顯示它。但是,是的,反過來。 – Drew