我尝试在存储过程中对另一个数据库(同一服务器)进行一次查询。 一切都还可以,但我需要使用从参数中收到的动态数据库名称。
CREATE PROCEDURE my_sp(
IN in_db_name VARCHAR(32),
OUT out_result VARCHAR(32)
)
BEGIN
/*This working OK*/
SELECT my_col INTO out_result FROM another_db.my_table WHERE id = 1;
/*This NOT WORK :( */
SELECT my_col INTO out_result FROM @in_db_name.my_table WHERE id = 1;
END;
答案 0 :(得分:0)
您需要为此目的使用动态查询。
CREATE PROCEDURE my_sp(
IN in_db_name VARCHAR(32),
OUT out_result VARCHAR(32)
)
SET @s = (concat ("SELECT my_col INTO out_result FROM " , in_db_name.my_table , " WHERE id = 1;"
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
答案 1 :(得分:0)
尝试:
DELIMITER //
CREATE PROCEDURE `my_sp` (
IN `in_db_name` VARCHAR(32),
OUT `out_result` VARCHAR(32)
)
BEGIN
SET @`query` := CONCAT('SELECT `my_col` INTO @`_out_result`
FROM `', `in_db_name`, '`.`my_table`
WHERE `id` = 1');
PREPARE `stmt` FROM @`query`;
EXECUTE `stmt`;
SET `out_result` := @`_out_result`;
DEALLOCATE PREPARE `stmt`;
END//
DELIMITER ;
请参阅14.5 Prepared SQL Statement Syntax。
示例:
mysql> DROP TABLE IF EXISTS `my_table`;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `my_table` (
-> `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> `my_col` VARCHAR(32) NOT NULL
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO `my_table` (`my_col`)
-> VALUES ('ONE');
Query OK, 1 row affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE `my_sp` (
-> IN `in_db_name` VARCHAR(32),
-> OUT `out_result` VARCHAR(32)
-> )
-> BEGIN
-> SET @`query` := CONCAT('SELECT `my_col` INTO @`_out_result`
'> FROM `', `in_db_name`, '`.`my_table`
'> WHERE `id` = 1');
-> PREPARE `stmt` FROM @`query`;
-> EXECUTE `stmt`;
-> SET `out_result` := @`_out_result`;
-> DEALLOCATE PREPARE `stmt`;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL `my_sp`('test', @`my_out_result`);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @`my_out_result`;
+------------------+
| @`my_out_result` |
+------------------+
| ONE |
+------------------+
1 row in set (0.00 sec)