Нельзя использовать PREPARE
для подготовки нескольких запросов, разделенных точками с запятой.Вы должны делать их по одному.
mysql> set @sql = "select * from foo ; select * from bar";
Query OK, 0 rows affected (0.01 sec)
mysql> prepare stmt from @sql;
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax
to use near 'select * from bar' at line 1
Я не знаю, почему так много разработчиков хотят использовать хранимые процедуры в MySQL.Они ужасныНет пакетов, нет пользовательских типов данных, нет компилятора, нет отладчика, и документация плохая.
Описанную вами задачу легче реализовать на любом языке сценариев.Выберите свой любимый язык, любой из них так же, как и другие, способен выполнять эту задачу.
Вот пример на Ruby:
require 'Mysql2'
db = Mysql2::Client.new(:host => "localhost", :username => "root", :database => "test")
["foo", "bar", "baz"].each do |table|
db.query("CREATE TABLE `#{table}` ( id INT AUTO_INCREMENT PRIMARY KEY )")
end
Сравните это с хитрым разбиением строк и объединениемподготовьте и выполните все необходимое, когда вы используете хранимую процедуру.
Я не использую хранимые процедуры MySQL и не рекомендую их использовать никому другому, кроме исключительных случаев.Один из случаев, когда я использовал хранимые процедуры, - это предоставление пользователям возможности выполнять несколько операторов SQL для данных, для которых у них нет других прав на просмотр.
Вот решение, протестированное на MySQL 5.6:
DELIMITER ;;
CREATE PROCEDURE the_worst_solution_for_this_task(IN tablenames TEXT)
BEGIN
DECLARE i INT;
DECLARE tablename VARCHAR(64);
SELECT LENGTH(tablenames)-LENGTH(REPLACE(tablenames, ',', ''))+1 INTO i;
WHILE i > 0
DO
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(tablenames, ',', i), ',', -1)) INTO tablename;
SET @sql = CONCAT('CREATE TABLE `', tablename, '` (id INT AUTO_INCREMENT PRIMARY KEY)');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET i = i - 1;
END WHILE;
END;;
DELIMITER ;
CALL the_worst_solution_for_this_task('foo,bar,baz');
SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| bar |
| baz |
| foo |
+----------------+