Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день, опять MySQL вводит меня в тупик, или я уже сам просто крайне невнимателен.
Хочу реализовать процедуру на добавление нового договора:
Неактивен
Впервые слышу об операторе ++ (check1++) в MySQL!
Неактивен
Вы думаете это не будет работать? Просто на set check1plus = check1 + 1 тоже ругался
Неактивен
думаю не будет.
Кроме того
new_id = check1plus; нужно SET new_id = check1plus;
else if нужно elseif
Отредактированно klow (15.05.2016 10:00:14)
Неактивен
klow написал:
думаю не будет.
Кроме того ELSE IF! http://dev.mysql.com/doc/refman/5.7/en/ … unction_if
рекомендую использовать CASE http://dev.mysql.com/doc/refman/5.7/en/ … rator_case
Хорошо, case - вероятно хорошее решение, но мне бы хотелось всё-таки ещё разобраться у себя с IF, что не нравится в моей конструкции
Неактивен
Ovenvan написал:
klow написал:
думаю не будет.
Кроме того ELSE IF! http://dev.mysql.com/doc/refman/5.7/en/ … unction_if
рекомендую использовать CASE http://dev.mysql.com/doc/refman/5.7/en/ … rator_caseХорошо, case - вероятно хорошее решение, но мне бы хотелось всё-таки ещё разобраться у себя с IF, что не нравится в моей конструкции
это я немного погорячился. Исправил. см. мое предыдущее сообщение
Отредактированно klow (15.05.2016 10:02:44)
Неактивен
Действительно нельзя использовать else if? хм.. не знал
Попробовал исправить по Вашим советам:
Неактивен
set check1plus = check1++;
Нужно
set check1plus = check1+1;
Кроме того, нужен только один end if;
Неактивен
Неактивен
Можно еще немного упростить
Отредактированно klow (15.05.2016 10:15:57)
Неактивен
Благодарю Вас, удалил лишние END IF, всё скомпилировалось.
Но теперь возникла проблема алгоритмическая, в таблице контрактов у меня в полях Individual и Company могут быть значения null, в зависимости с кем контракт, а при моей проверке постоянно выводит "Такого ... не существует ", как работать с null проверкой?
Например с таким вызовом: call SigningContract(11, 500, '2016-05-15', 11,
null, 7, 11, 5)
Ошибка не существования клиента, а он есть
Отредактированно Ovenvan (15.05.2016 11:11:21)
Неактивен
is null
Неактивен
Хм... я чего-то совсем не понимаю, вызов процедуры выполняется, но в таблицу ничего не добавляется
Отредактированно Ovenvan (15.05.2016 11:17:26)
Неактивен
if (select count(*) from insurance_contract where id_contract = new_id) = 0 then set new_id = check1 + 1; -- присвоили значение
...
end if;
end -- закончили процедуру. Почему что-то должно добавиться?
Неактивен
Посмотрите на условия. Например, смысла в set new_id = check1 + 1 первом IF вообще никакого нет. Оно все равно не будет использовано.
Возможно
Отредактированно klow (15.05.2016 11:33:19)
Неактивен
klow написал:
Не успел.
зато я только указал на проблему, а вы и решение предложили
Неактивен
То есть процедура должна иметь вот такой вид?
Отредактированно Ovenvan (15.05.2016 12:57:06)
Неактивен
Мне сложно судить не зная деталей задачи, но думаю нужно немного подправить
Отредактированно klow (15.05.2016 13:06:20)
Неактивен
Спасибо Вам всем за помощь, немного переписал процедуру, теперь не знаю как решить ещё одну проблемку.
Неактивен
А зачем функция?
Неактивен
rgbeast написал:
А зачем функция?
set ending = new_begin + INTERVAL periodplus YEAR;
Понимаю Вашу заинтересованность, просто уже придумать что-то из функций более толковое не смог. Кстати, функция это и делает
Неактивен
У Вас первый вызов
Неактивен
rgbeast написал:
У Вас первый вызов
set ending = AddPeriod(new_begin, periodplus);происходит до того, как переменной periodplus присвоено какое-либо значение. Поэтому результат NULL
Да, соглашусь, и поэтому у меня поле Ending может быть null. Возможно ли в этой процедуре после INSERT перезаписать это значение?
Я вот попробовал в конце
Неактивен
Отлаживайте вручную по шагам.
В guide_services есть необходимая запись?
Что попадает в переменную periodplus?
Неактивен
rgbeast написал:
Отлаживайте вручную по шагам.
В guide_services есть необходимая запись?
Что попадает в переменную periodplus?
Необходимая запись есть.
В guide_services содержится наименование услуги и её период страхования в виде обычного числа (количество лет), а в periodplus попадает как раз это число, которое используется в новом контракте.
Неактивен