![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
radislav72 |
![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 1.4.2010 Пользователь №: 1585 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Здравствуйте!
Есть такая задача: надо в функции просмотреть некоторую совокупность строк из таблицы, обработать их и возвратить результат. Для примера я написал сильно упрощенную функцию, но она не работает: возвращаемое значение всегда null
В етом примере функция через переменную summv должна бы возвращать сумму нескольких строк из таблицы: но она всегда возвращает только значение null: dps_row.summ не содержит значения из таблиц. Вызываю функцию, например так:
В таблице гарантированно существуют строки по заданному условию. Причем, если делать debug в среде SQL Manager 2007, то возвращаемое значение должно быть правильное, но результатом SELECTа всегда есть null: dps_row.summ не содержит значения из таблицы. Что не так? Как правильно в PostgreSQL- функции организовать цикл по совокупности записей таблицы? |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Я этой СУБД не знаю. У меня такой вопрос:
Если в выражении summv := summv + dps_row.summ;, хотя бы один член равен null, то что мы получим? |
|
|
radislav72 |
![]()
Сообщение
#3
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 1.4.2010 Пользователь №: 1585 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Если в выражении summv := summv + dps_row.summ;, хотя бы один член равен null, то что мы получим? Понятно что получим null. Но в таблице БД в указанной колонке вообще не может быть (и нет, что показывает "ручная" проверка) значений null (она создана как not null). Проблема какая-то в месте "+ dps_row.summ", если его заменить например на + 1, то все работает... "Работает", в смысле, что возвращает не нулл, а хотя б число... Но конечно, задача не выполняется ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
FOR dps_row IN вот эта часть мне непонятна. LOOP точно должен быть?SELECT id, summ FROM finance.deposites WHERE m_id = m_id_ AND dps_type = dps_type_ AND id <> id_ LOOP summv := summv + dps_row.summ; END LOOP; если пойти по аналогии с Firebird, то должно быть так:
|
|
|
radislav72 |
![]()
Сообщение
#5
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 1.4.2010 Пользователь №: 1585 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Firebird мне также хорошо знаком: на нем БД уже 15 лет пишу и поддерживаю
![]() ![]() Если убрать тот LOOP, о котором вы пишете, функция даже не компилируется. Может, книга застарая уже, и теперь такой вид цикла не поддерживается... |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
я думаю стоит поискать примеры на офсайте СУБД, может там и замечания какие-нибудь будут
|
|
|
radislav72 |
![]()
Сообщение
#7
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 1.4.2010 Пользователь №: 1585 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Нашел другой вариант цикла (работает как надо):
Почему первый вариан цикла не работал, так и не понял: вроде как книжка умная, и понятно написано ![]() |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 22.6.2025, 8:47 |