|
|
|
| Собственно, вот текст процедуры, которая собирает имена таблиц БД в переменную name_table и при помощи курсора последовательно их удаляет. Проблема в том, что в name_table передаются имена переменных, что можно проверить, заменив запрос удаления на вставку значения name-table в другую таблицу, но при DROP запросе name_table интерпретируется не как переменная, а как имя таблицы. Как оживить процедуру?
--в DROP TABLE не передаётся имя таблицы, то есть MySQL не считает name_table переменной
CREATE DEFINER = 'root'@'localhost' PROCEDURE `deltables`()
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE name_table TINYTEXT;
DECLARE is_end int DEFAULT 0;
DECLARE alldrop CURSOR FOR SHOW TABLES;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_end=1;
OPEN alldrop;
main: LOOP
FETCH alldrop INTO name_table;
IF is_end THEN LEAVE main;
END IF;
DROP TABLE name_table;
END LOOP main;
CLOSE alldrop;
END;
|
| |
|
|
|
|
|
|
|
для: Hatred
(20.09.2007 в 14:02)
| | Никто не знает? Даже cheops? Пробовал переменные писать через @, но MySQL на это ругается | |
|
|
|
|
|
|
|
для: Hatred
(23.09.2007 в 23:15)
| | Да все знают. Только все молчат. Читаем про динамические запросы ( разбор таких запросов осуществляется на этапе выполнения). | |
|
|
|
|
|
|
|
для: oradev
(23.09.2007 в 23:54)
| | Этого примера вполне хватит, думаю.
CREATE PROCEDURE set_col_value
(in_table VARCHAR(128),
in_column VARCHAR(128),
in_new_value VARCHAR(1000),
in_where VARCHAR(4000))
BEGIN
DECLARE l_sql VARCHAR(4000);
SET l_sql=CONCAT_ws(' ',
'UPDATE',in_table,
'SET',in_column,'=',in_new_value,
' WHERE',in_where);
SET @sql=l_sql;
PREPARE s1 FROM @sql;
EXECUTE s1;
DEALLOCATE PREPARE s1;
END;
|
| |
|
|
|
|
|
|
|
для: oradev
(24.09.2007 в 00:22)
| | Спасибо, почитаю. Что-то не соображу, что такое sl из выражения
Да и CONCAT_ws.
На Firebird процедуры гораздо лаконичнее. Ну, посмотрим. Иду на mysql.com читать. | |
|
|
|
|
|
|
|
для: Hatred
(25.09.2007 в 00:13)
| |
Призван объявить динамический запрос.
CONCAT_ws - используется в силу того что, обычная однострочная функция CONCAT может принимать не более двух аргументов.
Все остальное на http://dev.mysql.com | |
|
|
|