14.1.16 CREATE PROCEDURE and CREATE FUNCTION Syntax
...
USE Anweisungen in gespeicherten Routinen sind nicht gestattet. Wenn eine Routine aufgerufen wird, wird eine implizite USE-Datenbankname ausgeführt (und rückgängig gemacht, wenn die Routine beendet wird). Das bewirkt, dass die Routine während der Ausführung die angegebene Standarddatenbank hat. Verweise auf Objekte in Datenbanken mit Ausnahme der Standardroutinedatenbank sollten mit dem entsprechenden Datenbanknamen qualifiziert werden.
...
Eine Option, die gespeicherte Prozedur in verschiedenen Datenbanken zu erstellen ist:
FIle: /path/to/file/myProcedure.sql
DROP PROCEDURE IF EXISTS `test`;
DELIMITER //
CREATE PROCEDURE `test`()
BEGIN
SELECT * FROM `agreed_relation`;
END//
DELIMITER ;
MySQL-Kommandozeilen:
mysql> USE `dev`;
Database changed
mysql> \. /path/to/file/myProcedure.sql
Query OK, 0 rows affected (0.00 sec)
mysql> USE `db1`;
Database changed
mysql> \. /path/to/file/myProcedure.sql
Query OK, 0 rows affected (0.00 sec)
mysql> USE `db2`;
Database changed
mysql> \. /path/to/file/myProcedure.sql
Query OK, 0 rows affected (0.00 sec)
mysql> USE `dev`;
Database changed
mysql> CALL `test`;
Empty set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> USE `db1`;
Database changed
mysql> CALL `test`;
Empty set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> USE `db2`;
Database changed
mysql> CALL `test`;
Empty set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Sie können auch erstellen die gespeicherte Prozedur in einer einzigen Datenbank und die Datenbanknamen als Parameter qualifizierten die gewünschten Objekte passiert und 14.5 Prepared SQL Statement Syntax es auszuführen verwenden:
mysql> USE `dev`;
Database changed
mysql> DROP PROCEDURE IF EXISTS `test`;
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE `test`(`db_name` VARCHAR(64))
-> BEGIN
-> SET `db_name` := TRIM('\'' FROM QUOTE(`db_name`));
-> SET @`query` := CONCAT('SELECT * FROM `', `db_name`, '`.`agreed_relation`');
-> PREPARE `stmt` FROM @`query`;
-> EXECUTE `stmt`;
-> DEALLOCATE PREPARE `stmt`;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL `test`('dev');
Empty set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> CALL `test`('db1');
Empty set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> CALL `test`('db2');
Empty set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
meine unwissende Frage Bitte entschuldigen - aber es scheint, dass Sie alle Tabellen aus dem bewegen verschiedene db in eine Tabelle, richtig? Ich suchte nach einem allgemeinen Weg, um eine Variable zu übergeben, wenn ich mehrere verschiedene Tabellen in verschiedenen Datenbanken erstelle. – Huckleberry
Sie können nicht einfach eine Variable in verschiedene Datenbanken übergeben, Sie müssen eine db zu der Zeit bleiben oder "benutzen" und die Prozeduren innerhalb der db aufrufen, versuchen Sie einfach eine Prozedur aufzurufen, verwenden Sie "CREATE PROCEDURE test (IN idbname VARCHAR (20)) "um Variablen zu übergeben, wenn Sie es nennen" CALL-Test ("Wert"); " "idbname" ist die in der Prozedur deklarierte Variable. – Daniel