Stored procedures Firebird SQL光标重复最后一行

Stored procedures Firebird SQL光标重复最后一行,stored-procedures,cursor,firebird,firebird2.5,Stored Procedures,Cursor,Firebird,Firebird2.5,首先,对不起我的英语。我从FirebirdSQL 2.5中的游标开始,为销售注册系统编写一些存储过程。 在这种情况下,我需要计算信用卡的税款,这些税款由我国的银行从系统记录的销售额中兑现。以下是SP代码: create or alter procedure CURSOR_POC returns ( ID int, PRICE decimal(15,2), TAX decimal(15,2)) as declare variable GO_ON char(1); declare MY_

首先,对不起我的英语。我从FirebirdSQL 2.5中的游标开始,为销售注册系统编写一些存储过程。 在这种情况下,我需要计算信用卡的税款,这些税款由我国的银行从系统记录的销售额中兑现。以下是SP代码:

create or alter procedure CURSOR_POC
returns (
  ID int,
  PRICE decimal(15,2),
  TAX decimal(15,2))
as
declare variable GO_ON char(1);
declare MY_CURSOR cursor for (
  select CARD.CODE, sum(SALE.PRICE)
  from CARD join SALE on CARD.CODE = SALE.CARD_CODE
  where SALE.SALE_DATE = '14.10.2015'
  group by CARD_CODE);
begin
  open MY_CURSOR;
  GO_ON = 'Y';
  while(GO_ON='Y') do
  begin
    fetch MY_CURSOR into :ID, :PRICE;
    if (row_count = 1) then
    begin
      TAX = PRICE * (select CARD.TAXES from CARD where CARD.CODE = :ID);
      suspend;
    end else GO_ON = 'N';
    end
close MY_CURSOR;
suspend;
end
当我运行SP时,它的execute很好,但总是显示最后一行两次。例如,如果我在一个单独的文件Firebird中运行查询,则给出10行,但当我运行SP时,得到11行。 任何帮助都将不胜感激。提前,非常感谢

p.D.:我“翻译”了表格和属性名称,以便更容易理解。
P.D.2:游标定义中的日期过滤器(“dd/mm/yyyy”格式)仅用于测试de存储过程。

我会自己回答(我大学的一位教授在一个私人论坛上帮助我)。
解决方案很简单,只需从存储过程中删除最后一个“挂起”。因此,代码应该是

(...previous code...)

if (row_count = 1) then
begin
  TAX = PRICE * (select CARD.TAXES from CARD where CARD.CODE = :ID);
  suspend;
end else GO_ON = 'N';
end
close MY_CURSOR;
end

首先,为什么要使用光标?除非你隐藏了一些相关的东西,否则你应该可以用一句话来表达感谢你的快速回答。我使用游标是因为我需要合计一张信用卡的所有销售额,计算税费,然后处理下一张,最后,通过信用卡显示所有结果组。在这里,不同的信用卡现金不同的税(真的,这将像一个代理人的佣金)。当我只通过一个查询尝试它时,它会将所有的销售额合计在一行中,与信用卡无关。我希望让你了解我的情况。再次感谢,问题解决了。当然,谢谢你的关心,一匹没有名字的马