2016-04-21 56 views
3

同学们,我是Firebird的新人。我试图在游标循环中调用过程(p_procedure)并将结果插入表(tmp_port)。如何使用Firebird中的光标将行插入表中?

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; 

问题是,只有单一的,从cur_list_of_cont处理的fisrt行。 为什么其他99行不被处理?

UPDATE

火鸟服务器版本为2.5

UPDATE

在这个实现正常工作:

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

您是否检查过“p_procedure”是否为游标中的每条记录返回记录? IOW如果'p_procedure'为第二行返回空结果集,则不会将任何内容插入到tmp_port中,因此ROW_COUNT将为零并且循环将被打破。 – ain

+0

@ain谢谢ypur想法。游标'cur_list_of_cont'返回两个contracts.doc(1999和2000)。我用这两个contract.doc调用'p_procedure'并返回结果。 – May12

回答

4

问题是您错误地使用了ROW_COUNT

描述:如在Firebird 2.5 language reference记载的ROW_COUNT上下文变量包含受在当前触发最近的DML语句(INSERTUPDATEDELETESELECTFETCH),存储过程的行数或可执行块。

...

  • 从光标的FETCH后,ROW_COUNT是1,如果数据行被检索,否则为0。从同一游标读取更多的记录不增加ROW_COUNT超过1

如果没有删除该while (ROW_COUNT > 0)可能是假的,你也可以,如果你的程序不返回行和插入为此没有退出循环。

如果你看一下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,因为它是在大多数情况下更容易。

+0

谢谢。有用。我曾经在Oracle中使用open ... fetch构造,并试图在Firebird中使用它。你能否解释为什么'select'结构更受欢迎? – May12

+0

@ May12只要你不需要在循环体内进行多次提取,或者其他更棘手的事情,我宁愿简单而不愿意复杂性。在我看来,选择更简单,因为您不需要使用显式游标操作(如提取),并处理循环。 –

相关问题