如何使用Firebird中的游标将行插入表中?

时间:2016-04-21 15:49:58

标签: cursor firebird firebird2.5

大学,我是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;

如果第一个例子也适用,那会更好。怎么做?

1 个答案:

答案 0 :(得分:4)

问题是您错误地使用了ROW_COUNT。如Firebird 2.5 language reference中所述:

  

描述ROW_COUNT上下文变量包含受最新DML语句影响的行数(INSERTUPDATEDELETE ,当前触发器,存储过程或可执行块中的SELECTFETCH)。

     

...

     
      
  • 在游标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,因为在大多数情况下它更容易。