大学,我是Firebird的新手。我试图在游标周期中调用过程(p_procedure
)并将结果插入表(tmp_port
)。
execute block
as
declare contr integer;
declare IN$DT date;
declare cur_list_of_cont cursor for (select first 100 contracts.doc from TABLE_1);
begin
delete from tmp_port;
IN$DT = getdate()-2;
open cur_list_of_cont;
while (ROW_COUNT > 0) do
begin
fetch cur_list_of_cont into contr;
insert into tmp_port (
DT,
....)
select
:IN$DT as DT,
...
from p_procedure (0, :contr , :IN$DT);
if (ROW_COUNT = 0) then leave;
suspend;
end
close cur_list_of_cont;
end;
问题是只有一个fisrt行从cur_list_of_cont处理。 为什么不处理其他99行?
更新
FireBird服务器版本为2.5
更新
在这个实现中,它工作正常:
begin
IN$DT = getdate()-2;
FOR select first 100 contracts.doc from TABLE_1
INTO :contr
DO
BEGIN
insert into tmp_port (
DT,
....)
select
:IN$DT as DT,
...
from p_procedure (0, :contr , :IN$DT);
END
SUSPEND;
end;
如果第一个例子也适用,那会更好。怎么做?
答案 0 :(得分:4)
问题是您错误地使用了ROW_COUNT
。如Firebird 2.5 language reference中所述:
描述:
ROW_COUNT
上下文变量包含受最新DML语句影响的行数(INSERT
,UPDATE
,DELETE
,当前触发器,存储过程或可执行块中的SELECT
或FETCH
)。...
- 在游标
FETCH
之后,如果检索到数据行,则ROW_COUNT
为1,否则为0。从同一个游标中获取更多记录不会使ROW_COUNT
增加到超出1。
如果没有删除任何内容,while (ROW_COUNT > 0)
可能为false,如果您的过程没有返回任何行,则可能也会退出循环,因此没有插入任何内容。
如果您查看example of using FETCH
,可以将代码修改为:
open cur_list_of_cont;
fetch cur_list_of_cont into contr;
while (row_count > 0) do
begin
insert into tmp_port (
DT,
....)
select
:IN$DT as DT,
...
from p_procedure (0, :contr , :IN$DT);
fetch cur_list_of_cont into contr;
end
close cur_list_of_cont;
但是,考虑到您的代码,您应该考虑使用FOR SELECT
,因为在大多数情况下它更容易。