2013-05-02 168 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