2008-10-10 10 views

Antwort

42

Ich glaube nicht, dass MySQL dynamische sql unterstützt. Sie können "vorbereitete" Aussagen machen, die ähnlich, aber anders sind. Hier

ein Beispiel:

mysql> PREPARE stmt FROM 
    -> 'select count(*) 
    -> from information_schema.schemata 
    -> where schema_name = ? or schema_name = ?' 
; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 
mysql> EXECUTE stmt 
    -> USING @schema1,@schema2 
+----------+ 
| count(*) | 
+----------+ 
|  2 | 
+----------+ 
1 row in set (0.00 sec) 
mysql> DEALLOCATE PREPARE stmt; 

Die vorbereiteten Anweisungen werden häufig verwendet, um einen Ausführungsplan für eine bestimmte Abfrage zu sehen. Da sie mit dem Befehl ausgeführt werden und der sql einer Variablen zugewiesen werden kann, können Sie das gleiche Verhalten wie dynamic sql approximieren.

ist hier ein gutes link dazu:

Vergessen Sie nicht die stmt mit der letzten Zeile freigeben!

Viel Glück!

+3

es, wenn nicht funktioniert mit der '?' Ist an der Stelle des Tabellennamens –

+0

Sie dies über die versuchen Werden MySQL-Konsole? Oder verwenden Sie eine andere Methode. Wenn Sie diesen Code verwenden, muss Ihr Provider ihn unterstützen. –

+1

Offensichtlich studieren sie [EXECUTE IMMEDIATE] (http://dev.mysql.com/worklog/task/?id=2793) für zukünftige Versionen. –

91

Nach 5.0.13, in gespeicherten Prozeduren können Sie dynamische SQL verwenden:

delimiter // 
CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64)) 
BEGIN 
    SET @s = CONCAT('SELECT ',col,' FROM ',tbl); 
    PREPARE stmt FROM @s; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END 
// 
delimiter ; 

dynamische SQL funktioniert nicht in Funktionen oder Trigger. Weitere Informationen finden Sie unter the MySQL documentation.

2

Sie außerhalb des dynamischen Anweisung passieren können durch Benutzerdefinierte Variablen

Server version: 5.6.25-log MySQL Community Server (GPL) 

mysql> PREPARE stmt FROM 'select "AAAA" into @a'; 
Query OK, 0 rows affected (0.01 sec) 
Statement prepared 

mysql> EXECUTE stmt; 
Query OK, 1 row affected (0.01 sec) 

DEALLOCATE prepare stmt; 
Query OK, 0 rows affected (0.01 sec) 

mysql> select @a; 
+------+ 
| @a | 
+------+ 
|AAAA | 
+------+ 
1 row in set (0.01 sec)