2013-05-02 169 views
1

當我在控制檯中測試這個腳本時,它正在工作。mySQL存儲過程:輸入參數傳遞給show程序

我的腳本:

show fields from testdata1970_05.loadlv_test where FIELD not like 'ID_test'; 

我的存儲過程:

DELIMITER $$ 
DROP PROCEDURE IF EXISTS `testdata1970_05`.`list_testparameters` $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `list_testparameters`(IN nametest varchar(24)) 
BEGIN 
show fields from nametest where FIELD not like 'ID_test'; 
END $$ 
DELIMITER ; 

然而,當我建立一個基於這個腳本的存儲過程,這是行不通的。

執行存儲過程:

call list_testparameters(loadlv_test); 

錯誤:

ERROR 1054 (42S22): Unknown column 'loadlv_test' in 'field list' 

請告知爲什麼它不工作時,該acript可以在控制檯中工作?

+0

不應該用'call list_testparameters(testdata1970_05.loadlv_test)'調用它嗎? – fedorqui 2013-05-02 08:29:57

+0

它不起作用。沒有逗號,錯誤=未知表格。和上面的逗號,錯誤=數據太長,因爲第1行的'nametest' – user1739825 2013-05-02 08:34:44

+0

由於您將其定義爲'varchar(24)',因此將其增加至60或更大的值。 – fedorqui 2013-05-02 08:35:33

回答

1

假設testdata1970_05是一個數據庫,您需要動態生成SQL並執行它。

DELIMITER $$ 
DROP PROCEDURE IF EXISTS `testdata1970_05`.`list_testparameters` $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `list_testparameters`(IN nametest varchar(24)) 
BEGIN 
    SET @sql_text := CONCAT('show fields from ','`testdata1970_05`.`',@nametest,'` where FIELD not like ''ID_test'''; 
    PREPARE sqlstmt FROM @sql_text; 
    EXECUTE sqlstmt; 
END $$ 
DELIMITER ; 
+0

是不是可以直接創建這個句子,而無需事先生成並執行? – fedorqui 2013-05-02 09:12:39

+0

是的可能,因爲在sql中沒有使用參數。但我只想保持安全。 – shazin 2013-05-02 09:15:40

+0

好的,我明白了。我無法弄清楚OP所顯示的程序有什麼問題。無論如何,+1這樣解決它。 – fedorqui 2013-05-02 09:19:12