2017-03-21 1 views
0

Ich möchte in der Lage sein, einige gespeicherte Prozeduren in verschiedenen Datenbanken zu erstellen - also möchte ich in der Lage sein, den Datenbanknamen in die Erstellungsanweisung für gespeicherte Prozeduren zu übergeben.Wie man Variablen in MySql übergibt Prozedur erstellen

SET @SourceDBName='dev'; 
DELIMITER // 
CREATE PROCEDURE test() 
BEGIN 
    USE @SourceDBName; 
    SELECT * FROM agreed_relation; 
END // 
DELIMITER ; 

Wie kann ich @SourceDBName in die CREATE PROCEDURE Anweisung übergeben?

Antwort

1

in dem Datenbanknamen in eine gespeicherte Prozedur zu übergeben Sie es in dem Verfahren wie folgt erklären muss:

DELIMITER // 
CREATE PROCEDURE test (IN idbname VARCHAR(20)) 
BEGIN 
    SELECT * FROM agreed_relation WHERE dbname = idbname; 
END // 
DELIMITER ; 

Nachdem Sie eine Tabelle wie dieser, wo erstellen ‚dbname‘ Feld es ist das eine Prozedur aufruft :

create table agreed_relation 
(
dbname varchar(30) not null 
); 

nach einige Werte legen Sie die Prozedur aufrufen und jede dbname zum SELECT statament passieren:

insert into agreed_relation(dbname) values('Oracle'); 
insert into agreed_relation(dbname) values('Mysql'); 
insert into agreed_relation(dbname) values('Mongodb'); 

Prozedur aufrufen und einen Wert übergeben:

CALL test('Mysql'); 
+0

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

+0

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

0

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) 
Verwandte Themen