Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cursor 如何在Firebird中使用游标将行插入表中?_Cursor_Firebird_Firebird2.5 - Fatal编程技术网

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

Cursor 如何在Firebird中使用游标将行插入表中?,cursor,firebird,firebird2.5,Cursor,Firebird,Firebird2.5,同事们,我是火鸟队的新手。我试图在游标循环中调用过程p_过程,并将结果插入表tmp_端口 执行块 像 声明控制整数; 以美元申报日期; 从表_1中选择前100个contracts.doc的_cont游标的declare cur_list_; 开始 从tmp_端口删除; 在$DT中=getdate-2; 打开控制的当前列表; 当行数>0时,执行以下操作: 开始 将控制的当前列表提取到控制中; 插入tmp_端口 DT, .... 选择 :以$DT作为DT, ... 从p_程序0开始,:控制,:单位:

同事们,我是火鸟队的新手。我试图在游标循环中调用过程p_过程,并将结果插入表tmp_端口

执行块 像 声明控制整数; 以美元申报日期; 从表_1中选择前100个contracts.doc的_cont游标的declare cur_list_; 开始 从tmp_端口删除; 在$DT中=getdate-2; 打开控制的当前列表; 当行数>0时,执行以下操作: 开始 将控制的当前列表提取到控制中; 插入tmp_端口 DT, .... 选择 :以$DT作为DT, ... 从p_程序0开始,:控制,:单位:DT; 如果ROW_COUNT=0,则离开; 悬 终止 关闭控制的当前列表; 终止 问题是,只有第一行从\u cont的cur\u list\u处理。 为什么其他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;

如果第一个例子也能奏效,那就更好了。怎么做?

问题是您使用的行数不正确。如以下文件所述:

描述:ROW_COUNT上下文变量包含受当前触发器、存储过程或可执行块中最新DML语句INSERT、UPDATE、DELETE、SELECT或FETCH影响的行数

从游标获取数据后,如果检索到数据行,则行计数为1,否则为0。从同一游标中获取更多记录不会使行数增量超过1。 如果未删除任何内容,则while ROW_COUNT>0可能为false;如果过程未返回任何行,因此未插入任何内容,则也可能退出循环

如果查看,可以将代码修改为:

打开控制的当前列表; 将控制的当前列表提取到控制中; 当行数>0时,执行以下操作: 开始 插入tmp_端口 DT, .... 选择 :以$DT作为DT, ... 从p_程序0开始,:控制,:单位:DT; 将控制的当前列表提取到控制中; 终止 关闭控制的当前列表;

但是,在给定代码的情况下,您应该考虑使用SELECT,因为大多数情况下更容易。

您检查PY过程是否从游标返回每个记录的记录?如果p_过程返回第二行的空结果集,则不会向tmp_端口插入任何内容,因此,行计数将为零,循环将被中断…@ain感谢您的建议。光标cur_list_of_cont返回两个contract.doc 1999和2000。我用这两个contracts.doc调用p_过程,它会返回结果。谢谢。它起作用了。我曾在Oracle中使用open…fetch构造,并尝试在Firebird中使用它。你能解释一下为什么选择构造更受欢迎吗?@5月12日只要你不需要在循环体内部进行多次抓取或其他更棘手的事情,我宁愿简单而不是复杂。在我看来,for select更简单,因为您不需要使用诸如fetch之类的显式游标操作,也不需要处理循环。