Задавайте вопросы, мы ответим
Вы не зашли.
Уважаемые участники форума!
Прошу помощи в написании Хранимой Процедуры...
Задача:
Есть таблица DSR_PeriodsSet которая имеет поля ID Name PeriodID BeginPeriod EndPeriod ElementaryPeriodsLength и хранит наборы периодов следующего вида:
f8b53ed9-687b-8ddb-5d7d-7d5a749574f8 авыфавыф bd32eb68-2991-f3da-7a7c-c4e463c4f4ea 2010-04-15 06:32:28 2010-04-29 17:14:26
f8b53ed9-687b-8ddb-5d7d-7d5a749574f8 авыфавыф 8b4071c0-c724-c69e-f0e4-9c16e520fc26 2010-04-15 06:32:28 2010-04-29 17:14:26 10
f8b53ed9-687b-8ddb-5d7d-7d5a749574f8 авыфавыф e7b6f556-e8eb-9be5-8b3e-54f79a467ac9 2010-04-10 17:22:53 2010-04-22 08:41:25 15
Так же есть Хранимая Процедура getElementaryPeriods(beginPrd, endPrd, lengthPrd) которая возвращает таблицу с полями BeginElementaryPeriod EndElementaryPeriod следующего вида:
Call getElementaryPeriods('2010-04-15 06:32:28', '2010-04-29 17:14:26', 10);
2010-04-15 06:32:28 2010-04-15 06:40:00
2010-04-15 06:40:00 2010-04-15 06:50:00
2010-04-15 06:50:00 2010-04-15 07:00:00
2010-04-15 07:00:00 2010-04-15 07:10:00
2010-04-15 07:10:00 2010-04-15 07:20:00
2010-04-15 07:20:00 2010-04-15 07:30:00
2010-04-15 07:30:00 2010-04-15 07:40:00
Необходимо создать Хранимую Процедуру, которая будет создавать таблицу DSR_PeriodsByPeriodSetID которая будет содержать периоды данного набора периодов... При этом - если в поле ElementaryPeriodsLength стоит значение NULL - заносим в данную таблицу только значения BeginPeriod EndPeriod, а если в данном поле есть какое-либо значение длины элементарных периодов - необходимо занести все значение, которая вернет процедура getElementaryPeriods(beginPrd, endPrd, lengthPrd) (но... данная процедура реализована так, что при каждом вызове удаляет все значения в таблице ElementaryPeriods и заносит туда новые в зависимости от параметров... т.е. значения нужно брать из данной таблицы), при этом всем этим значениям присвоить ID данного набора...
Саму Хранимку я написал:
Отредактированно NDS (01.06.2010 23:37:38)
Неактивен
Вы правильно определили источник проблемы.
Нужно
SELECT periodSetID, prdID, BeginElementaryPeriod, EndElementaryPeriod
FROM ElementaryPeriods
Если Вы пишете SELECT col1, col2, ..., [что-то еще] FROM table, Вы говорите "выбрать мне для каждой записи значение col1 (т.е. одну ячейку), col2 (тоже одну ячейку) и что-то еще". Подумайте, что получится, если [что-то еще] - это больше, чем одна ячейка.
Неактивен
Уважаемый, LazY!
Спасибо Вам за ответ!
Действительно... я изменил ошибочный фрагмент на данный:
Отредактированно NDS (02.06.2010 00:10:45)
Неактивен
не обрабатывается значение NULL...
Вы уверены, что у Вас там именно NULL, а не пустая строка? (каким образом в таблицу NULL вставляли?)
Неактивен
Значение NULL я заношу в PHP-скрипте:
Отредактированно NDS (02.06.2010 00:24:47)
Неактивен
Все нормально... я разобрался.
данная ХП, почему-то, выводила значения итоговой выборки в ХП getElementaryPeriods()
-- ИТОГОВАЯ ВЫБОРКА
select *
from ElementaryPeriods;
я закомментировал данные строчки - и теперь выводит значения из таблицы DSR_PeriodsByPeriodSetID.
И так же убрал сортировку order by PeriodSetID, PeriodID, BeginPeriod, EndPeriod asc; из хранимой процедуры getPeriodsByPeriodSetID()
а то при выводе нарушается, собственно, сам смысл данной процедуры)))
Уважаемый LazY,
еще раз, спасибо за помощь!!
Неактивен
К сожалению я обнаружил ошибку в работе процедуры getPeriodsByPeriodSetID()... ((
Отредактированно NDS (02.06.2010 12:41:17)
Неактивен
Проблема решена)
Последний период заносился два раза из-за неправильной организации курсора. Точнее обработчика его окончания...
Неактивен
Обычно при передвижении курсора пользуются выходом из цикла с помощьюд маркеров блока:
OPEN DSRPeriodsSetCursor;
fetch: LOOP
-- LOOP - безусловный цикл;
-- fetch - маркер блока, что-то типа имени (можно и другое)
FETCH DSRPeriodsSetCursor INTO prdID, beginPrd, endPrd, elemPrdLength;
IF done = 1 THEN
LEAVE fetch; -- покидаем блок по имени fetch
END IF;
-- дальше всё остальное (которое выполнится, если CONTINUE HANDLER не сработал)
-- ...
END LOOP;
Неактивен
LazY,
спасибо за совет!
Буду иметь в виду...
Неактивен