Cursor 如何在Firebird中使用游标将行插入表中?
同事们,我是火鸟队的新手。我试图在游标循环中调用过程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 更新 在这种情况下,它可以很好地工作: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开始,:控制,:单位:
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之类的显式游标操作,也不需要处理循环。