SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.02.2009 22:29:12

alexeews
Участник
Зарегистрирован: 07.02.2009
Сообщений: 12

Ошибка в хранимой функции, помогите разобраться

Подскажите плз. почему


INSERT INTO `[prefix]_rubrics` ( `id` , `date` ) VALUES ("", NOW());
 

генерирует предуреждеие. ([prefix] - здесь и далее заменяется на произвольный, опеделённый пользователем префикс средствами PHP)

Код функции:


                                                     CREATE FUNCTION `[prefix]_ADD_RUBRIC`(user_idnr INT)
                                                     RETURNS INT
                                                      LANGUAGE SQL         #Язык функции SQL
                                                      NOT DETERMINISTIC    #Функция может возвращать разные результаты для одних и тех же параметров
                                                      SQL SECURITY INVOKER #Разрешена для запуска любым пользователем
                                                       BEGIN

                                                        #Переменные используемые функцией

                                                        DECLARE user_grant INT;                #ID прав текущего прользователя
                                                        DECLARE max_language_id INT;           #Максемальный ID таблицы языков
                                                        DECLARE inserted_id INT DEFAULT 0;     #ID сгенерированный INSERT запросом
                                                        DECLARE cur_language_id INT DEFAULT 0; #ID текущий ID обрабатываемый курсором
                                                        DECLARE roll_back_var INT DEFAULT 0;   #Флаг указывающий на то, что была совершена хотябы одна втавка данных в таблицу [prefix]_rubrics_names

                                                        #Курсоры

                                                        #Курсор выбирает все идентификаторы языков
                                                        DECLARE language_cursor CURSOR FOR SELECT `[language_id_field]` FROM `[language_table]` LIMIT 255;

                                                        #Обработчики ошибок

                                                        DECLARE EXIT HANDLER FOR SQLWARNING #Обработка SQL предупреждений
                                                         BEGIN
                                                          #Производим откат
                                                          IF (inserted_id > 0) THEN
                                                           DELETE FROM `[prefix]_rubrics` WHERE `id` = inserted_id LIMIT 1;
                                                          END IF;
                                                          IF (roll_back_var > 0) THEN
                                                           DELETE FROM `[prefix]_rubrics_names` WHERE `rubric_id` = inserted_id;
                                                          END IF;
                                                          RETURN -1; #Возвращаем флаг неудачи
                                                         END;

                                                        DECLARE EXIT HANDLER FOR NOT FOUND #Обработка SQL ошибок типа - невозможно найти объект
                                                         BEGIN
                                                          #Производим откат
                                                          IF (inserted_id > 0) THEN
                                                           DELETE FROM `[prefix]_rubrics` WHERE `id` = inserted_id LIMIT 1;
                                                          END IF;
                                                          IF (roll_back_var > 0) THEN
                                                           DELETE FROM `[prefix]_rubrics_names` WHERE `rubric_id` = inserted_id;
                                                          END IF;
                                                          RETURN -2; #Возвращаем флаг неудачи
                                                         END;

                                                        DECLARE EXIT HANDLER FOR SQLEXCEPTION #Обработка ошибок неохваченных NOT FOUND и SQLWORNING
                                                         BEGIN
                                                          #Производим откат
                                                          IF (inserted_id > 0) THEN
                                                           DELETE FROM `[prefix]_rubrics` WHERE `id` = inserted_id LIMIT 1;
                                                          END IF;
                                                          IF (roll_back_var > 0) THEN
                                                           DELETE FROM `[prefix]_rubrics_names` WHERE `rubric_id` = inserted_id;
                                                          END IF;
                                                          RETURN -3; #Возвращаем флаг неудачи
                                                         END;

                                                        #Тело процедуры

                                                        #Проверяем наличие необходимых прав у пользователя
                                                        SELECT [prefix]_CHECK_USER_GRANT(user_idnr, "add_rubric") INTO user_grant;

                                                        IF (user_grant = 1) THEN

                                                         #Поскольку в случае использования функций транзакции не доступны,
                                                         #то для сохранения целостности данных выберем сформируем переменную
                                                         #значение которой будем использовать для реализации отката

                                                         SELECT MAX(`[language_id_field]`) INTO max_language_id FROM `[language_table]` LIMIT 1; #Определяем максемальный ID в таблице языков
                                                         INSERT INTO `[prefix]_rubrics` ( `id` , `date` ) VALUES ("", NOW()); #Добавляем новую рубрику
                                                         SET inserted_id = LAST_INSERT_ID();  #Получаем ID новой рубрики

                                                         OPEN language_cursor; #Открываем курсор

                                                          insert_lines : LOOP #Циклически обходи курсор, добавляя записи

                                                           FETCH language_cursor INTO cur_language_id;
                                                           INSERT INTO `[prefix]_rubrics_names` ( `id` , `rubric_id` , `rubric_name` , `language_id` ) VALUES ("", inserted_id, "", cur_language_id);
                                                           SET roll_back_var = 1;
                                                           IF (cur_language_id = max_language_id) THEN LEAVE insert_lines;
                                                           END IF;

                                                          END LOOP insert_lines;

                                                         CLOSE language_cursor; #Закрываем курсор

                                                         RETURN 1; #Устанавливаем флаг успеха
                                                        ELSE
                                                         RETURN -4; #Устанавливаем флаг неудачи
                                                        END IF;
                                                       END;
 


Зарание благодарю.

Неактивен

 

#2 11.02.2009 12:13:47

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: Ошибка в хранимой функции, помогите разобраться

А какое предупреждение?

Предположу, что, если колонка называется `id`, то в таблице она имеет целочисленный тип (скорее всего INT). У Вас же вставляется строка, хотя и пустая - "". Предупреждение генерится из-за того, что строка преобразуется в число - наверняка что-то типа "Data truncated for ..." (дальше точно не помню).
Такая же ситуация и в запросе

INSERT INTO `[prefix]_rubrics_names` ( `id` , `rubric_id` , `rubric_name` , `language_id` ) VALUES ("", inserted_id, "", cur_language_id);

Неактивен

 

#3 11.02.2009 13:53:11

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Ошибка в хранимой функции, помогите разобраться

Угу, и лечится заменой "" на NULL.

Неактивен

 

#4 11.02.2009 14:06:52

alexeews
Участник
Зарегистрирован: 07.02.2009
Сообщений: 12

Re: Ошибка в хранимой функции, помогите разобраться

Спасибо всем откликнувшимся.

На NULL поменял не вышло  все равно упорно в качестве результата выбрасывает -1, убираю обработчик предупреждений всё отрабатывает нормально.

Неактивен

 

#5 11.02.2009 15:06:17

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Ошибка в хранимой функции, помогите разобраться

А id - автоинкрементное поле?

Неактивен

 

#6 11.02.2009 17:34:23

alexeews
Участник
Зарегистрирован: 07.02.2009
Сообщений: 12

Re: Ошибка в хранимой функции, помогите разобраться

Да автоинкрементное.

Неактивен

 

#7 11.02.2009 18:19:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Ошибка в хранимой функции, помогите разобраться

Тогда или Вы где-то ошибаетесь в других кусках кода, или в других столбцах. Таки текст ворнинга в студию.

mysql> create table ai (id int key auto_increment, `date` timestamp);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into ai (`id`, `date`) values ("", NOW());
Query OK, 1 row affected, 1 warning (0.03 sec)
Warning (Code 1366): Incorrect integer value: '' for column 'id' at row 1

mysql> insert into ai (`id`, `date`) values (NULL, NOW());
Query OK, 1 row affected (0.00 sec)

Неактивен

 

#8 14.02.2009 17:59:18

alexeews
Участник
Зарегистрирован: 07.02.2009
Сообщений: 12

Re: Ошибка в хранимой функции, помогите разобраться

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

Неактивен

 

#9 14.02.2009 18:12:47

alexeews
Участник
Зарегистрирован: 07.02.2009
Сообщений: 12

Re: Ошибка в хранимой функции, помогите разобраться

Возник ещё один опрос в тему,

есть процедура:

   


     CREATE PROCEDURE `TEST_SHOW_ARTICLE_STATISTIC`(IN article_idnr INT)
      LANGUAGE SQL         #Язык процедуры SQL
         BEGIN
            SELECT * FROM `test_statistics` WHERE `article_id` = article_idnr LIMIT 1;
         END;
   


    Не обращайте внимания на то, что она почти ничего не делает – она тестовая.

    Так вот при её вызове:

   

     CALL TEST_SHOW_ARTICLE_STATISTIC( 1 );
   


    получаю ошибку: #1312 - PROCEDURE article.TEST_SHOW_ARTICLE_STATISTIC can't return a result set in the given context
   
   Суть вопроса в следующем, в литературе, (в частности “MySQL 5 наиболее подробное руководство в подлиннике” авторы Максим Кузнецов и Игорь Симдянов) полно примеров процедур возвращающих результирующие сеты, на подобии той, что приведена выше так почему она не хочет работать и выдаёт ошибку. Можно ли вообще вернуть сет при помощи процедуры?

Отредактированно alexeews (14.02.2009 18:15:36)

Неактивен

 

#10 14.02.2009 18:19:14

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Ошибка в хранимой функции, помогите разобраться

Вы вызываете из PHP? Используйте расширение mysqli

Неактивен

 

#11 14.02.2009 18:21:58

alexeews
Участник
Зарегистрирован: 07.02.2009
Сообщений: 12

Re: Ошибка в хранимой функции, помогите разобраться

Спасибо, а как это сделать, где можно почитать про расширение mysqli

Отредактированно alexeews (14.02.2009 18:22:40)

Неактивен

 

#12 14.02.2009 18:27:07

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Ошибка в хранимой функции, помогите разобраться

Неактивен

 

#13 14.02.2009 18:28:23

alexeews
Участник
Зарегистрирован: 07.02.2009
Сообщений: 12

Re: Ошибка в хранимой функции, помогите разобраться

Спасибо

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson