SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 10.06.2015 22:15:57

Jyonsi
Участник
Зарегистрирован: 10.06.2015
Сообщений: 2

очень хитрый запрос с call proc() или я что-то не так делаю?

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


CREATE DEFINER=`root`@`localhost` PROCEDURE `getAllPoints`()
BEGIN
declare done1, done2, done3, done4, pointAlive BOOLEAN DEFAULT FALSE;
*куча объявлений*
...
*конец объявлений*


**главный цикл

declare cur1 cursor for select id, Owner_idOwner, longitude, lat,x,y from Point;
declare continue handler for not found set done1= TRUE;

DROP TEMPORARY TABLE IF EXISTS TEMP;
CREATE temporary TABLE IF NOT EXISTS TEMP (
** куча всего***

)ENGINE=MEMORY;
open cur1;

mainLoop: loop
fetch cur1 into pointid, ownerid, pointlong, pointlat, pointx,pointy;

if done1 then
set done1 = FALSE;
close cur1;
leave mainLoop;
end if;
insert into TEMP (тут работает);

BLOCK2:BEGIN
**рабочий блок с курсором №1**

END BLOCK2 ;
BLOCK3:BEGIN
**рабочий блок курсором №2**
END BLOCK3;

** вот что не работает:

call isAlive(pointid <<- переменная с значением,@Alive,@timeTill);
update TEMP set Open = @Alive, TimeTill= @timeTill where Point_id = pointid;*/

end loop mainLoop;
select * from TEMP;

**Выводит только первую строку.
**Если убрать вызов isAlive() - выдаст ~1200 строк

END



**а вот isAlive()

CREATE DEFINER=`root`@`localhost` PROCEDURE `isAlive`(IN iPoint_id int, INOUT Alive int, INOUT timeTill time)
BEGIN
declare pointAlive int;
select count(id) into pointAlive from Schedule where
day = dayofweek(curdate())-1
and Point_id = iPoint_id
and Start < curtime()
and Stop > curtime();

if poinTalive then
select pointAlive,timediff(Stop,curtime()) INTO Alive, timeTill
from Schedule
where day = dayofweek(curdate()) -1
and Point_id = iPoint_id;
else
select pointAlive,timediff(str_to_date(concat(curdate(),' ',@starttime), "%Y-%m-%d %T"),now()) INTO Alive, timeTill
from Schedule
where day = dayofweek(curdate()) -1
and Point_id = iPoint_id;
end if;

END

Подскажите, что-же я делаю не правильно? Получается что после вызова isAlive с параметром внутри цикла mainloop эта процедура при возврате значений делает "break" mainloop?

Отредактированно Jyonsi (10.06.2015 22:50:24)

Неактивен

 

#2 11.06.2015 21:38:12

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

Re: очень хитрый запрос с call proc() или я что-то не так делаю?

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

в каком клиенте выполняете? ошибок не показывает?

Неактивен

 

#3 12.06.2015 17:15:01

Jyonsi
Участник
Зарегистрирован: 10.06.2015
Сообщений: 2

Re: очень хитрый запрос с call proc() или я что-то не так делаю?

vasya написал:

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

в каком клиенте выполняете? ошибок не показывает?

Добрый день, спасибо за внимание!

ключевые слова - имеется ввиду системные переменные\функции? (Start,Stop)?

работаю в Workbench, ошибок не показывает...

Неактивен

 

#4 13.06.2015 08:37:01

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

Re: очень хитрый запрос с call proc() или я что-то не так делаю?

1. да

2. можете сделать максимально упрощенный пример воспроизводящий проблему? т.е.
create table ..
insert into ..
create procedure ..
..

Неактивен

 

Board footer

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