连接表名的MySQL存储过程变量
我想在存储过程中执行以下查询,而无需准备查询,因为这会导致OUT-to-pass-back参数出现问题连接表名的MySQL存储过程变量,mysql,stored-procedures,concat,Mysql,Stored Procedures,Concat,我想在存储过程中执行以下查询,而无需准备查询,因为这会导致OUT-to-pass-back参数出现问题 DELIMITER // CREATE PROCEDURE Test ( IN CID BIGINT(20), IN IDs LONGTEXT ) BEGIN #EXECUTE UNDERNEATH QUERY SELECT * FROM CONCAT('Part1_OfTableName', CID); #CID IS CustomerID E
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 ;
然而,这失败了,我不知道如何解决这个问题
(请注意,在本例中,我的表名中没有空格,但在我的情况下,我的表名中可能有空格)如果需要使用必须准备好的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中工作得更多
需要注意的是:
- 临时表是特定于连接/会话的,因此,尽管从全局角度来看,使用诸如
之类的通用名称是安全的,但如果先前在连接/会话(或通过调用此名称的过程)上执行的查询使用相同的名称,则可能会出现问题;在practice/paranoia中,我倾向于使用不同的guid(在使用此技术的每个过程中)作为其中生成的任何临时表的前缀myresults
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中工作得更多
需要注意的是:
- 临时表是特定于连接/会话的,因此,尽管从全局角度来看,使用诸如
之类的通用名称是安全的,但如果先前在连接/会话(或通过调用此名称的过程)上执行的查询使用相同的名称,则可能会出现问题;在practice/paranoia中,我倾向于使用不同的guid(在使用此技术的每个过程中)作为其中生成的任何临时表的前缀myresults
PREPARE
不应影响您成功设置过程参数的能力
设置分隔符//
创建过程测试(在cid INT中,在ids文本中,在OUT_INT中)
开始
设置@sql=CONCAT('SELECT*FROM'table_uz',cid',`',如果id为NULL,则为''ELSE-CONCAT('WHERE-id IN(',ids','))')END);
从@sql准备stmt;
执行stmt;
解除分配准备stmt;
放线_int=1;
结束//
设置分隔符;
示例用法:
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)
mysql>调用测试(1,'2,3',@out_int);
+------+
|身份证|
+------+
| 2 |
| 3 |
+------+
一组2行(0.00秒)
查询正常,0行受影响(0.00秒)
mysql>选择@out\u int;
+----------+
|@out\u int|
+----------+
| 1 |
+----------+
一行一组(0.00秒)
PREPARE
不应影响您成功设置过程的参数的能力
设置分隔符//
创建过程测试(在cid INT中,在ids文本中,在OUT_INT中)
开始
设置@sql=CONCAT('SELECT*FROM'table_uz',cid',`',如果id为NULL,则为''ELSE-CONCAT('WHERE-id IN(',ids','))')END);
从@sql准备stmt;
执行stmt;
解除分配准备stmt;
放线_int=1;
结束//
设置分隔符;
示例用法:
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)
mysql>调用测试(1,'2,3',@out_int);
+------+
|身份证|
+------+
| 2 |
| 3 |
+------+
一组2行(0.00秒)
查询正常,0行受影响(0.00秒)
mysql>选择@out\u int;
+----------+
|@out\u int|
+----------+
| 1 |
+----------+
一行一组(0.00秒)
如果不从字符串构造查询,则无法动态更改表名。。。您必须准备好。@UeerDo我现在有,但这使我的OUT参数无法检索。。。(返回错误:不同步)正如@uuerdo提到的,您不能这样做。MySql中的所有标识符(表、列名等)都是静态的。您所指的OUT
参数是什么?您提供的代码不包含任何内容。@peterm,事实上,提供的代码不包含任何内容,只是为了让其他人更容易阅读。我有一些OUT参数,如INT、VARCHAR等。是否也可以返回带有OUT参数的结果集?如果不从字符串构造查询,则无法动态更改表名。。。您必须准备好。@UeerDo我现在有,但这使我的OUT参数无法检索。。。(返回错误:不同步)正如@uuerdo提到的,您不能这样做。MySql中的所有标识符(表、列名等)都是静态的。您所指的OUT
参数是什么?您提供的代码不包含任何内容。@peterm,事实上,提供的代码不包含任何内容,只是为了让其他人更容易阅读。我有一些OUT参数,比如INT、VARCHAR等。是否也可以返回带有OUT参数的结果集?太好了,这样我就可以继续使用OUT参数了?我会尝试一下,在你的例子中没有看到任何参数;我假设你在谈论结果集。我也对获取结果集感兴趣。最有可能与一些OUT参数(如INT和VARCHAR)结合使用时,sIt将真正取决于您希望如何/如何分配给这些参数;大概您可以使用myresults
表中的信息在删除它之前填写它们。太好了,这样我就可以继续使用out参数了?我会尝试一下,在你的例子中没有看到任何参数;我假设你在谈论结果集。我也对获取结果集感兴趣。最有可能与一些OUT参数(如INT和VARCHAR)结合使用时,sIt将真正取决于您希望如何/如何分配给这些参数;大概您可以使用myresults
表中的信息在删除它之前填写它们。