SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 19.07.2009 03:13:53

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

Если запрос в процедуре не возвращает записей процедура останавливается.

Вознкла именно такая проблема, делаю запрос в процедуре и если он не возвращает ни  одной записи то дальнейшее выполнение процедуры не идет. Проверил вставив select curtime(); после запроса.
Подскажите пожалуйста как быть?
Вот тот запрос:


SELECT t1.doc_id, count(t1.word_hash) AS parent INTO p_parent,p_c_doc_id

FROM items_hashes t1, items_hashes_tmp t2

WHERE t2.doc_id=p_item_id AND t1.word_hash=t2.word_hash

GROUP BY t1.doc_id

ORDER BY parent DESC

LIMIT 1;
 

В таблице t1 нет ни одной записи на данный момент.

Неактивен

 

#2 19.07.2009 04:30:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Если запрос в процедуре не возвращает записей процедура останавливается.

Сам по себе пустой запрос  ни на что не влияет. В этом вы можете убедиться сделав простейшую процедуру из двух запросов, первый из которых пустой.

В данном случае при выполнении запроса происходит ошибка и дальнейшее выполнение прерывается. Например, как декларированы ли переменные p_parent,p_c_doc_id?
Приведите полный вариант процедуры.

Неактивен

 

#3 19.07.2009 08:03:21

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

Re: Если запрос в процедуре не возвращает записей процедура останавливается.

Вот так:
DECLARE p_c_doc_id,p_parent INT default 0;

Неактивен

 

#4 19.07.2009 08:05:23

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

Re: Если запрос в процедуре не возвращает записей процедура останавливается.

Вот полный вариант процедуры:


DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`one`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `one`()
BEGIN
  DECLARE p_item_id,p_c_doc_id,p_parent,p_percent INT default 0;
  DECLARE p_count INT default 0;
  DECLARE cur1 CURSOR FOR SELECT id FROM items WHERE percent=-1 limit 1;

  OPEN cur1;

  BEGIN
    DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;
    LOOP
      FETCH cur1 INTO p_item_id;
    SELECT COUNT(doc_id)  into p_count FROM items_hashes_tmp WHERE doc_id=p_item_id;
    SELECT t1.doc_id, count(t1.word_hash) AS parent INTO p_parent,p_c_doc_id

      FROM items_hashes t1, items_hashes_tmp t2

      WHERE t2.doc_id=p_item_id and t1.word_hash=t2.word_hash

      GROUP BY t1.doc_id

      ORDER BY parent DESC

      LIMIT 1;
select curtime();
    END LOOP;
  END;

  CLOSE cur1;

END$$

DELIMITER ;
 

Неактивен

 

#5 19.07.2009 20:22:43

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Если запрос в процедуре не возвращает записей процедура останавливается.

DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;

Неактивен

 

#6 19.07.2009 20:26:47

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

Re: Если запрос в процедуре не возвращает записей процедура останавливается.

Закомментил строку и заработало, спасибо. Буду разбираться что к чему там написано.

Неактивен

 

#7 19.07.2009 22:44:21

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Если запрос в процедуре не возвращает записей процедура останавливается.

Эта строка предписывает прекратить выполнение процедуры в случае наступления события NOT FOUND.

Неактивен

 

Board footer

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