Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Не работает процедура

Сообщения:  [1-6] 

 
 автор: oradev   (25.09.2007 в 13:09)   письмо автору
 
   для: Hatred   (25.09.2007 в 00:13)
 


PREPARE s1 FROM @sql;  


Призван объявить динамический запрос.


CONCAT_ws - используется в силу того что, обычная однострочная функция CONCAT может принимать не более двух аргументов.

Все остальное на http://dev.mysql.com

   
 
 автор: Hatred   (25.09.2007 в 00:13)   письмо автору
 
   для: oradev   (24.09.2007 в 00:22)
 

Спасибо, почитаю. Что-то не соображу, что такое sl из выражения


PREPARE s1 FROM @sql;


Да и CONCAT_ws.

На Firebird процедуры гораздо лаконичнее. Ну, посмотрим. Иду на mysql.com читать.

   
 
 автор: oradev   (24.09.2007 в 00:22)   письмо автору
 
   для: 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   (23.09.2007 в 23:54)   письмо автору
 
   для: Hatred   (23.09.2007 в 23:15)
 

Да все знают. Только все молчат. Читаем про динамические запросы ( разбор таких запросов осуществляется на этапе выполнения).

   
 
 автор: Hatred   (23.09.2007 в 23:15)   письмо автору
 
   для: Hatred   (20.09.2007 в 14:02)
 

Никто не знает? Даже cheops? Пробовал переменные писать через @, но MySQL на это ругается

   
 
 автор: Hatred   (20.09.2007 в 14:02)   письмо автору
 
 

Собственно, вот текст процедуры, которая собирает имена таблиц БД в переменную 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;

   

Сообщения:  [1-6] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования