在文档here中,给出了使用cursor
的以下代码示例:
execute block
returns (
relation char(31),
sysflag int)
as
declare cur cursor for
(select rdb$relation_name, rdb$system_flag from rdb$relations);
begin
open cur;
while (1=1) do
begin
fetch cur into relation, sysflag;
if (row_count = 0) then leave;
suspend;
end
close cur;
end
但这也可以按如下方式完成:
execute block
returns (
relation char(31),
sysflag int)
as
begin
for select rdb$relation_name, rdb$system_flag
from rdb$relations
into relation, sysflag
do begin
suspend;
end
end
那我为什么要用一个呢?最终上面的例子甚至不需要execlute block
,因为它只是一个简单的select语句。所以我想这个例子太简单了,无法证明这一点的好处。
答案 0 :(得分:2)
您链接到的文档(及其newer 2.5 counterpart)已经包含了您(或不会)使用游标(强调我的)的大多数原因:
如果仅需要光标来遍历结果集,使用
ImageLoader imageLoader = AppController.getInstance().getImageLoader(); imageLoader.get("your image path", ImageLoader.getImageListener( imgNetWorkView, R.drawable.ico_loading, R.drawable.ico_error)); imgNetWorkView.setImageUrl("your image path", imageLoader);
语句<{1}}语句1}}语句几乎总是更容易且不易出错。必须显式打开声明的游标,用于获取数据并关闭。每次获取后都必须检查上下文变量FOR SELECT
,如果其值为零,则必须终止循环。AS CURSOR
语句会自动检查它。尽管如此,声明的游标提供了对顺序事件的高级控制,并允许并行管理多个游标。
简而言之,您通常应该使用ROW_COUNT
,除非您需要同时访问多个游标,或者可能需要一些比简单循环更复杂的逻辑。它还可以在代码的多个部分中重用相同的游标定义(尽管这可能表明您需要在多个存储过程中分解代码)。
工具的存在并不意味着它应该用于所有事物。
顺便说一下,FOR SELECT
也是一个游标,除了你没有明确控制它(它隐藏了大部分的丑陋;)。
答案 1 :(得分:1)
另一种可能使用游标的情况是,当需要更新检索到的行时,查找或重新定位(确定确切的WHERE子句)行可能是个问题。在这种情况下,您可以使用FOR UPDATE子句打开游标,并使用WHERE CURRENT OF子句更新(或删除)行。