Создать процедуру из выбранного запроса

Мне нужно написать хранимую процедуру в Firebird 2.5. Я написал этот sql-запрос:

INSERT INTO A_OBRATYKUMHIST(OBRAT, MONTH, YEAR, SECURITYUSER_ID, FIRM_ID)
select 
    sum(AO.Obrat), 11, 2010, AO.SecurityUser_ID, AO.Firm_ID
from A_OBRATYKUMHIST_TEMP AO
where
    AO.Rok = 2010
    and AO.Mesic <= 11
group by
    AO.SecurityUser_ID, AO.Firm_ID;

Моя цель - заполнить таблицу кумулятивными суммами.

редактировать 1:

Итак, я написал это:

SET TERM ^ ;

CREATE OR ALTER PROCEDURE A_TESTIK (
    start_year integer,
    end_year integer)
returns (
    obrat integer,
    mesic integer,
    rok integer)
as
declare variable "YEAR" integer = 2005;
declare variable "MONTH" integer = 1;
begin
    select
        sum(II.localamountwithoutvat), ib_decodedate_month(VatDate$DATE),
            ib_decodedate_month(VatDate$DATE)
    from IssuedInvoices II
    group by
        ib_decodedate_month(VatDate$DATE), ib_decodedate_month(VatDate$DATE)
    into :obrat, :mesic, :rok;
    suspend;
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON ISSUEDINVOICES TO PROCEDURE A_TESTIK;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE A_TESTIK TO SYSDBA;

Но когда я запускаю это, я получаю сообщение об ошибке: "Multiple rows in singleton select". Как я могу это исправить?


person Sk1X1    schedule 26.03.2014    source источник
comment
Материалы для чтения: Справочник по языку Interbase 6.0 (в частности, глава 3 "Процедуры и триггеры") и Обновление справочника по языку Firebird 2.5   -  person Mark Rotteveel    schedule 26.03.2014
comment
И если это не поможет, пожалуйста, уточните, что вы хотите знать.   -  person Mark Rotteveel    schedule 26.03.2014
comment
@Mihai Полезный комментарий   -  person Sk1X1    schedule 26.03.2014
comment
@MarkRotteveel Спасибо, я проверю.   -  person Sk1X1    schedule 26.03.2014
comment
@Mark Rotteveel, я отредактировал свой вопрос :)   -  person Sk1X1    schedule 27.03.2014


Ответы (2)


Если SELECT возвращает несколько строк, вам нужно использовать FOR SELECT ... DO ...

Измените тело хранимой процедуры на:

FOR select
       sum(II.localamountwithoutvat), ib_decodedate_month(VatDate$DATE),
        ib_decodedate_month(VatDate$DATE)
   from IssuedInvoices II
   group by
       ib_decodedate_month(VatDate$DATE), ib_decodedate_month(VatDate$DATE)
   into :obrat, :mesic, :rok
DO
   suspend;
person Mark Rotteveel    schedule 27.03.2014

Вот синтаксис процедуры Firebird:

CREATE PROCEDURE name [(param1 datatype1, param2 datatype2, ...)] 
[RETURNS (param3 datatype3, param4 datatype4, ...)] 
AS BEGIN
  <body>
END; 

Остальное зависит от тебя !

Вот хороший материал о процессах в Firebird

person Up_One    schedule 26.03.2014
comment
Спасибо, я проверю. - person Sk1X1; 26.03.2014
comment
Если мой ответ послужит! Отметь ответ как отвеченный! Up_One для меня! - person Up_One; 26.03.2014