Русские документы
Ежедневные компьютерные новости RSS rusdoc.ru  Найти :
• Новости
• Последние поступления
• Книжный магазин
  Hardware:
• Видеоустройства
• Системные платы
• Процессоры
• Мобильные устройства
• Аудиосистема
• Охлаждение системы
• Накопители информации
• КПК и ноутбуки
• Телефоны и связь
• Периферия
• Система
• Сети
• Разные устройства
 
  Programming:
• Web-разработка
• Языки программирования
• Технологии и теория
• Разработка игр
• Программная инженерия
 
  Software:
• Операционные системы
• Windows 7
• Базы данных
• Обзоры программ
• Графика и дизайн
   
  Life:
• Компьютерная жизнь
• Разные материалы
   
• Партнеры
• Публикация
• Правовая информация
• Реклама на сайте
• Обратная связь
• Экспорт в RSS Экспорт в RSS2.0
    Читать в Яндекс.Ленте



MySQL: Хранимые процедуры и динамический SQL

Раздел: Software / mySQL @ 27.02.2009 | Ключевые слова: mysql хранимые процедуры версия для печати

Автор: mgyk
Источник: habrahabr

Если кто-либо из вас пытался сделать вроде бы очевидную вещь, а именно, создать sql запрос внутри процедуры передав ей имя таблицы, пользователя и т.п., то скорее всего натыкались на ошибку, о том, что нельзя использовать динамический sql.

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

Такая конструкция работать не будет. А что же делать, чтобы она заработала?

Для примера напишем процедуру архивации любой таблицы в БД.
Процедура будет принимать название таблицы в качестве параметра и создавать другую таблицу с используя engine=ARCHIVE

DELIMITER $$

DROP PROCEDURE IF EXISTS `create_archive`$$
CREATE PROCEDURE `create_archive`(IN current_table VARCHAR(50)
)
BEGIN
DECLARE template,archive_template VARCHAR(50);

-- Если название таблицы было mydata
-- то получаем название архивной таблицы mydata_20090226

SET archive_template=replace(curdate(),"-","");
SET template=CONCAT(current_table,"_",archive_template);

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

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 ;

Для того чтобы составить динамический запрос нужно сначала собрать его через CONCAT() и далее выполнить используя PREPARE,EXECUTE. Такой метод очень часто применим для построения сложных запросов в процедурах. Надеюсь, кому-нибудь пригодится.

Это интересно:








версия для печатиРаспечатать статью


Вернуться в раздел: Software / mySQL


Реклама:
Читать наc на:

Add to Google
Читать в Яндекс.Ленте






Rambler's Top100
© Copyright 1998-2012 Александр Томов. All rights reserved.