2008-10-10 12 views

Odpowiedz

42

Nie wierzę, że MySQL obsługuje dynamiczny sql. Możesz wykonywać "przygotowane" instrukcje, które są podobne, ale różne.

Oto przykład:

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; 

Sporządzone sprawozdania są często używane, aby zobaczyć plan wykonania dla danego zapytania. Ponieważ są one wykonywane za pomocą komendy execute i można przypisać ją do zmiennej, można w przybliżeniu przypisać to samo zachowanie, co dynamiczny sql.

Oto dobry link o tym:

Nie zapomnij deallocate stmt stosując ostatnią linię!

Powodzenia!

+3

to nie działa, gdy '?' Jest w miejscu nazwy tabeli –

+0

starasz to za pośrednictwem konsola mysql? lub używając innej metody, jeśli używasz tego w kodzie, Twój dostawca musiałby go wspierać. –

+1

Najwyraźniej uczą się [WYKONUJ NATYCHMIAST] (http://dev.mysql.com/worklog/task/?id=2793) dla przyszłych wersji. –

91

Po 5.0.13, procedur przechowywanych, można użyć dynamicznego SQL:

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 ; 

Dynamiczny SQL nie działa w funkcji lub wyzwala. Aby uzyskać więcej informacji, patrz the MySQL documentation.

2

Można przejść thru poza dynamicznej instrukcji za pomocą zdefiniowanych przez użytkownika zmienne

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) 
Powiązane problemy