Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接表名的MySQL存储过程变量_Mysql_Stored Procedures_Concat - Fatal编程技术网

连接表名的MySQL存储过程变量

连接表名的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

我想在存储过程中执行以下查询,而无需准备查询,因为这会导致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
    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中工作得更多

需要注意的是:

  • 临时表是特定于连接/会话的,因此,尽管从全局角度来看,使用诸如
    myresults
    之类的通用名称是安全的,但如果先前在连接/会话(或通过调用此名称的过程)上执行的查询使用相同的名称,则可能会出现问题;在practice/paranoia中,我倾向于使用不同的guid(在使用此技术的每个过程中)作为其中生成的任何临时表的前缀

如果需要使用必须准备好的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
    之类的通用名称是安全的,但如果先前在连接/会话(或通过调用此名称的过程)上执行的查询使用相同的名称,则可能会出现问题;在practice/paranoia中,我倾向于使用不同的guid(在使用此技术的每个过程中)作为其中生成的任何临时表的前缀

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
表中的信息在删除它之前填写它们。