Firebird SQL 游标重复最后一行
Firebird SQL cursor repeat last row
首先,对不起我的英语。我从 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.: 我"translate"表和属性的名字是为了让它更稳定。
P.D.2: 游标定义中的日期过滤器("dd/mm/yyyy" 格式)仅定义为测试存储过程。
我会自己回答(一位教授在我大学的私人论坛上帮助我)。
解决方案非常简单,只需从存储过程中删除最后一个 "suspend"。所以,代码应该是
(...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
首先,对不起我的英语。我从 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.: 我"translate"表和属性的名字是为了让它更稳定。
P.D.2: 游标定义中的日期过滤器("dd/mm/yyyy" 格式)仅定义为测试存储过程。
我会自己回答(一位教授在我大学的私人论坛上帮助我)。
解决方案非常简单,只需从存储过程中删除最后一个 "suspend"。所以,代码应该是
(...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