2013-04-22 63 views
2

我在mysql中编写了一个过程,它从表中返回一个随机值。但是我有很多表,并且我想多次使用这个过程,所以我添加了作为过程参数名称表,从中我想要rand值,我将传递给过程的名称也作为参数:MySQL - 如何存储执行结果

delimiter // 

CREATE PROCEDURE randomDefVal(val varchar(50), tableName varchar(50),OUT randomVal varchar(50)) 

    BEGIN 

    SET @tmpTableName = tableName; 

    SET @sql_querry = concat('SELECT',@tmpVal,'FROM',@tmpTableName,'ORDER BY rand() LIMIT 1'); 

    PREPARE stmt FROM @sql_text; 

    EXECUTE stmt using @randomVal; 

    DEALLOCATE PREPARE stmt;  

END 

但是当我运行这段代码我有一个错误:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1 

任何人能解释我怎么能我的EXECUTE结果存储在一个变量?

// SOLUTION

对于这些人如何有同样的问题,因为我有,我想表明我已经做出了表率的解决方案:

delimiter // 

CREATE PROCEDURE tmpProcedure(tableName varchar(20)) 

BEGIN 

DECLARE my_query varchar(60); 

DECLARE value varchar(20); 

SET @my_query = concat('Select Name FROM ',tableName,' ORDER BY rand() LIMIT 1 INTO @outvar'); 

PREPARE stmt from @my_query; 

EXECUTE stmt; 

SET val = (SELECT @outvar); 

END// 

我希望这将是对你有帮助。

回答

2

我在代码中发现了一些错误,特别是关于变量名拼写不同或者根本没有声明的错误。看看这个代码应该是有效的:

delimiter // 

CREATE PROCEDURE randomDefVal(val varchar(50), tableName varchar(50),OUT randomVal varchar(50)) 

BEGIN 

SET @tmpTableName = tableName; 
SET @tmpVal = val; 
SET @randomVal = randomVal; 

SET @sql_querry = concat('SELECT',@tmpVal,'FROM',@tmpTableName,'ORDER BY rand() LIMIT 1'); 

PREPARE stmt FROM @sql_text; 

EXECUTE stmt using @randomVal; 

DEALLOCATE PREPARE stmt; 

END 
// 
+0

我看到我犯了什么错误。但是我一直都有同样的错误。也许我称这个程序不正确。我只是做了'CALL randomDefVal('xyz','abc',@ randomVal)。我应该如何纠正这个过程的调用,以及如何正确访问randomVal中存储执行结果的randomVal? – Ziva 2013-04-22 11:23:08