Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Подскажите, в чем дело - ошибка в функции !!!  [new]
Профессор
Member

Откуда: Санкт-Петербург
Сообщений: 40
Освоением DB2 занимаюсь недавно. Не понимаю в чем дело!
Синтаксис как буд-то правильный. Что не так !
Подскажите, кто знает.

Тело функции:

CREATE FUNCTION FITOG_TURNOVER (data1 date, data2 date, reg int, whoiscall int)
RETURNS INT
READS SQL DATA
LANGUAGE SQL
BEGIN ATOMIC

DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE var INT DEFAULT 0;
DECLARE KdB smallint DEFAULT 0;
DECLARE KdS smallint DEFAULT 0;

declare cur cursor WITH RETURN for select KodB, KodS from shop where active = 1 order by KodB, KodS

FOR FETCH ONLY;
open cur;

FETCH FROM cur INTO Kdb, Kds;
WHILE (SQLSTATE = '00000') DO
if whoiscall = 1 then
set var = var + FGET_SUMMA (KdB, KdS, data1, data2, reg);
else
set var = var + FGET_TURNOVER (KdB, KdS, data1, data2, reg);
end if;
FETCH FROM cur INTO Kdb, Kds;
END WHILE;

CLOSE cur;

RETURN VAR;
END#



Интерпретатор выдает ошибку:

SQL0104N Обнаружен неправильный элемент "declare cur cursor WITH RETURN for"
после текста "mallint DEFAULT 0; ". Список возможных правильных элементов:
"<space>". LINE NUMBER=12. SQLSTATE=42601

SQL0104N Обнаружен неправильный элемент "declare cur cursor WITH RETURN for" после текста "mallint DEFAULT 0;

". Список возможных правильных элементов: "<space> ".
11 мар 10, 11:52    [8460551]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, в чем дело - ошибка в функции !!!  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Профессор,

Если версия db2 - 9.7, уберите ATOMIC.
Если нет, то нельзя курсоры в функциях использовать.

Да и в любом случае надо бы типа такого что-то:
CREATE FUNCTION FITOG_TURNOVER (data1 date, data2 date, reg int, whoiscall int)
RETURNS INT
READS SQL DATA
LANGUAGE SQL
RETURN coalesce((
select sum(
case whoiscall
 when 1 then FGET_SUMMA (KodB, KodS, data1, data2, reg)
 else FGET_TURNOVER (KodB, KodS, data1, data2, reg)
end
)
from shop 
where active = 1
), 0)#
11 мар 10, 12:22    [8460875]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, в чем дело - ошибка в функции !!!  [new]
Профессор
Member

Откуда: Санкт-Петербург
Сообщений: 40
Mark Barinstein,

Курсоры нельзя использовать? :((
А что тогда можно? В смысле существует какая-то универсальная конструкция, заменяющая курсор - в общем виде хотя бы.
11 мар 10, 12:35    [8460987]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, в чем дело - ошибка в функции !!!  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Профессор
Курсоры нельзя использовать? :((
А что тогда можно? В смысле существует какая-то универсальная конструкция, заменяющая курсор - в общем виде хотя бы.
FOR statement.
11 мар 10, 12:44    [8461094]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, в чем дело - ошибка в функции !!!  [new]
Профессор
Member

Откуда: Санкт-Петербург
Сообщений: 40
Mark Barinstein,

Понял, спасибо - буду разбираться
11 мар 10, 13:13    [8461343]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, в чем дело - ошибка в функции !!!  [new]
Lkhiger
Member

Откуда:
Сообщений: 98
Профессор, со своей стороны замечу, что курсор неправильного типа.

"WITH RETURN" подразумевает возврат RS юзеру, что абсолютно противоречит понятию скалярной функции.

С уважением, Лёня Х.
11 мар 10, 15:35    [8462786]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить