Jak budować i używać dynamicznego sql w przechowywanej procedurze MySQL?Jak mieć dynamiczny SQL w przechowywanej procedurze MySQL
53
A
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!
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)
to nie działa, gdy '?' Jest w miejscu nazwy tabeli –
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ć. –
Najwyraźniej uczą się [WYKONUJ NATYCHMIAST] (http://dev.mysql.com/worklog/task/?id=2793) dla przyszłych wersji. –