Страница 1 из 1
Help новичку! Вопрос по функциям в IB/Firebird
Добавлено: 04 сен 2007, 10:19
vetal71
Здравствуйте все. Помогите разобраться в следующем вопросе.
Есть таблица видов расчетов, где указана формула расчета типа:
formula = n1+n5+lastval(n10), где lastval - функция, которая находит значение n10 за прошлый месяц. Можно ли средствами IB/Firebird реализовать следующий запрос:
UPDATE <TABLENAME> SET n25 = <FORMULA> ?
Как заставить сервер распозанать lastval() (к примеру в Sybase есть возможность писать собственные internal функции) ? Может есть возможность использования процедуры ?
Помогите, пожалуйста, раобраться с ситуацией.
Спасибо.
Добавлено: 04 сен 2007, 10:23
kdv
в IB/FB такого вида функций нет. Следовательно, нужно написать процедуру, в которой сначала надо посчитать чего там последнее, и затем присвоить это в update.
Добавлено: 07 сен 2007, 12:05
vetal71
kdv писал(а):в IB/FB такого вида функций нет. Следовательно, нужно написать процедуру, в которой сначала надо посчитать чего там последнее, и затем присвоить это в update.
Начал пытаться, но столкнулся с такой вещью:
Код процедуры
Код: Выделить всё
CREATE PROCEDURE LASTVAL (
RASCHID INTEGER,
FLAG SMALLINT,
TAB INTEGER,
D_W DATE)
RETURNS (
RASCH_VAL NUMERIC(15,0))
AS
DECLARE VARIABLE SQL_TEXT VARCHAR(1024); /* SQL òåêñò, äëÿ âûïîëíåíèÿ SELECT */
DECLARE VARIABLE D_R DATE; /* Ðàñ÷åòíàÿ äàòà */
begin
RASCH_VAL = 0;
if (FLAG = 0) then /* Íå ó÷èòûâàòü äåêàáðü*/
BEGIN
if (f_month(d_w) = 1) then
BEGIN
SUSPEND;
EXIT;
END
END
D_R = F_ADDMONTH(D_W,-1);
SQL_TEXT = 'SELECT S'||CAST(:RASCHID AS VARCHAR(4))||
' FROM ZARP_ARH WHERE TAB = '||CAST(:TAB AS VARCHAR(4))||
' AND PERIOD = '''||CAST(:D_R AS VARCHAR(10))||'''';
EXECUTE STATEMENT SQL_TEXT INTO :RASCH_VAL;
suspend;
end
при вызове SELECT * FROM LASTVAL(100,0,90,'01.02.2007') выдает ошибку Unsuccessful execution caused by an unavailable resource.
Variable type (position 1) in EXECUTE STATEMENT 'SELECT S100 FROM ZARP_ARH WHERE' INTO does not match returned column type.
At procedure 'LASTVAL'.
Что здесь не так ???
Добавлено: 07 сен 2007, 12:46
kdv
новичок, а уже полез execute statement использовать...
Что здесь не так ???
читай сообщение об ошибке. И описание синтаксиса ES.
Добавлено: 07 сен 2007, 13:05
vetal71
kdv писал(а):новичок, а уже полез execute statement использовать...
можно конечно без execute statement, просто выполнять динамический запрос на клиенте, но все таки почему при отладке вышеуказанной процедуры в дебугере, она вернула правильное значение ?
Добавлено: 07 сен 2007, 13:38
vetal71
kdv писал(а):читай сообщение об ошибке. И описание синтаксиса ES.
почитал, подумал, поменял rasch_val на integer и все заработало
Спасибо за ответы