创建一个 MYSQL 存储过程以在不同的数据库中创建表
Posted
技术标签:
【中文标题】创建一个 MYSQL 存储过程以在不同的数据库中创建表【英文标题】:Create a MYSQL stored proc to create table in a different database 【发布时间】:2020-11-23 17:41:58 【问题描述】:我正在尝试创建一个可以跨多个数据库使用但不必在所有数据库中复制存储过程的存储过程。
示例:在 BIZ_ADM 中有可以运行的存储过程,并且可以将参数传递给它,从而在另一个数据库 BIZ_OPS 中创建表和视图
CALL CreateNewEntity1
('KTC_SHARED', 'TEST1', 'SHARED');
分隔符 $$
使用KTC_SHARED
$$
如果存在则删除程序CreateNewEntity1
$$
CREATE DEFINER=root
@192.168.0.%
PROCEDURE CreateNewEntity1
(IN databaseNameSTR VARCHAR (64), IN entityNameSTR VARCHAR(64), IN extSTR VARCHAR(64))
开始
SET @sqlSTR = CONCAT("CREATE TABLE TBL_", entityNameSTR, "
(标准字段等)
如果要在当前数据库中创建,我可以做任何事情,但在尝试在不同的数据库中创建时不起作用。希望这足以清楚地了解我要做什么。
提前感谢您提供的任何帮助。
【问题讨论】:
忘了说,不要跨多个数据库复制,因为这个存储过程会被频繁使用。 【参考方案1】:从 CLI 窗口复制:
Server version: 8.0.21 mysql Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> USE test
Database changed
mysql> CREATE DATABASE test1;
Query OK, 1 row affected (0.15 sec)
mysql> DELIMITER ;;
mysql> CREATE PROCEDURE test1.createtable (IN db VARCHAR(64), IN tb VARCHAR(64))
-> BEGIN
-> SET @sql:=CONCAT('CREATE TABLE ', db, '.', tb, '(id INT, val INT);');
-> PREPARE stmt FROM @sql;
-> EXECUTE stmt;
-> DROP PREPARE stmt;
-> END; ;;
Query OK, 0 rows affected (0.19 sec)
mysql> DELIMITER ;
mysql> SHOW TABLES;
Empty set (0.09 sec)
mysql> CALL test1.createtable('test', 'test');
Query OK, 0 rows affected (0.66 sec)
mysql> SHOW TABLES FROM test;
+----------------+
| Tables_in_test |
+----------------+
| test |
+----------------+
1 row in set (0.11 sec)
mysql>
【讨论】:
Akina,感谢您的回复。为了清楚起见,我希望能够从任何数据库运行存储过程,并让它在我作为参数列出的任何数据库中创建表和视图。您的回复会这样做还是我仍然必须在每个数据库中都有存储过程?谢谢 @dcbk 仔细看 - SP 不是在当前数据库中创建的。没有什么能阻止将 DB1 设为当前并从 DB2 执行 SP,从而在 DB3 中创建一个表。以上是关于创建一个 MYSQL 存储过程以在不同的数据库中创建表的主要内容,如果未能解决你的问题,请参考以下文章
创建 Restful Web 服务以在 C# 中调用存储过程