Firebird SQL游标重复最后一行

时间:2015-10-23 11:47:55

标签: 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_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时,它执行得很好,但总是显示最后一行两次。例如,如果我在单独的文件中运行查询,Firebird会给我10行,但是当我运行SP时,我有11行。 任何帮助将不胜感激。提前,非常感谢。

P.D。:我"翻译"表格和属性名称,以使其更加明显 P.D.2:游标定义中的日期过滤器(" dd / mm / yyyy"格式)仅定义为测试存储过程。

1 个答案:

答案 0 :(得分:3)

我会自己回答(一位教授在我的大学私人论坛帮助我。)解决方案就像擦除存储过程中的最后一个“暂停”一样简单。所以,代码应该是

(...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