2017-04-26 44 views
0

我希望在存储过程中执行以下查询而无需准备查询,因为这会给OUT传递参数带来问题。作为表名连接的MySQL存储过程变量

DELIMITER // 
CREATE PROCEDURE Test (
    IN CID BIGINT(20), 
    IN IDs LONGTEXT 
    ) 
BEGIN 
    #EXECUTE UNDERNEATH QUERY 
    SELECT * FROM CONCAT('Part1_OfTableName', CID); #CID IS CustomerID 
    END // 
DELIMITER ; 

但是,这失败了,我不知道如何解决这个问题。

如果您需要返回从结果(请注意,在例子中,我有我的表名没有空格,但在我的情况我会在我的表名的空间虽然)

+0

你不能没有从构造查询动态变化的表名一个字符串...你必须要PREPARE。 – Uueerdo

+0

@Uueerdo我现在有,但这使得我的OUT参数无法检索...(返回我的错误:**不同步**) –

+0

由于@Uueerdo提到你不能这样做。所有标识符(表,列名等)在MySql中都是静态的。你指的是什么'OUT'参数?您提供的代码不包含任何代码。 – peterm

回答

2

PREPARE应该有你的能力没有影响到成功设置好程序的OUT参数

SET DELIMITER // 
CREATE PROCEDURE test(IN cid INT, IN ids TEXT, OUT out_int INT) 
BEGIN 
    SET @sql = CONCAT('SELECT * FROM `table_', cid, '`', CASE WHEN ids IS NULL THEN '' ELSE CONCAT(' WHERE id IN(', ids, ')') END); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    SET out_int = 1; 
END// 
SET DELIMITER ; 

使用范例:

 
mysql> CALL test(1, '2,3', @out_int); 
+------+ 
| id | 
+------+ 
| 2 | 
| 3 | 
+------+ 
2 rows in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @out_int; 
+----------+ 
| @out_int | 
+----------+ 
|  1 | 
+----------+ 
1 row in set (0.00 sec) 
+0

感谢这工作如预期! –

1

存储过程使用必须准备的sql语句,可以使用中间临时表。

BEGIN 

CREATE TEMPORARY TABLE `myresults` blah blah....; 
//construct and prepare select you would've used, but start it with an insert like so... 
// INSERT INTO `myresults` SELECT .... 

// Execute the prepared query 
SELECT * FROM `myresults`; 
DROP TEMPORARY TABLE `myresults`; 
END 

......至少我敢肯定,此技术用于工作;在过去的几年里,我一直在MSSQL工作。

一些需要注意:如果查询的连接/会话先前执行

  • 临时表连接/会话特定的,因此,尽管从全球范围来看安全使用通用名称,如myresults可能会出现问题(或通过调用这个程序的过程)使用相同的名称;在实践中/偏执狂中,我倾向于使用不同的guid(在使用这种技术的每个过程中)作为其中生成的任何临时表的前缀。
+0

太好了,所以这会让我仍然可以使用我的OUT参数?我会试一试 –

+0

在你的例子中我没有看到任何OUT参数;我假设你在谈论结果集。 – Uueerdo

+0

我也有兴趣获得结果集。最有可能与某些OUT参数结合使用,例如INT和VARCHAR的 –