Показаны сообщения с ярлыком mysql. Показать все сообщения
Показаны сообщения с ярлыком mysql. Показать все сообщения

понедельник, 4 февраля 2008 г.

Хранимые процедуры и динамические таблицы

Довольно часто возникает задача обработать одну или несколько таблиц с помощью одной и той же процедуры. Причем, передавая название таблицы в параметре процедуры.
MySQL не воспринимает зарпосы такого вида:

SET @mytable='users';
SELECT * FROM @mytable;


Обойти эту проблему можно так, вот пример процедуры выполняющие архивацию таблиц:

DELIMITER $$

DROP PROCEDURE IF EXISTS `mydb`.`create_archive`$$
CREATE DEFINER=`alex`@`%` PROCEDURE `create_archive`(
IN current_table VARCHAR(50)
)
BEGIN
DECLARE template,archive_template VARCHAR(50);
/* Если название таблицы было my_data
то получаем название архивной таблицы my_data_200802 */

SET archive_prefix='200802';
SET template=CONCAT(current_table,"_",archive_prefix);

/* Эта конструкция формирует запрос который будет выглядить так
CREATE TABLE my_data_200802 ENGINE_ARCHIVE
AS (SELECT * FROM my_data); */

SET @archive_query:=CONCAT
("CREATE TABLE ",template, " ENGINE=ARCHIVE AS
(SELECT * FROM ",current_table," )");

PREPARE archive_query FROM @archive_query;
EXECUTE archive_query;
DEALLOCATE PREPARE archive_query;

END$$

DELIMITER ;


Продолжение следует....