Firebird Cursors - 你为什么要使用它?

时间:2016-05-25 19:22:42

标签: sql cursor firebird

在文档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语句。所以我想这个例子太简单了,无法证明这一点的好处。

2 个答案:

答案 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}}语句FOR SELECT,如果其值为零,则必须终止循环。 AS CURSOR语句会自动检查它。

     

尽管如此,声明的游标提供了对顺序事件的高级控制,并允许并行管理多个游标。

简而言之,您通常应该使用ROW_COUNT,除非您需要同时访问多个游标,或者可能需要一些比简单循环更复杂的逻辑。它还可以在代码的多个部分中重用相同的游标定义(尽管这可能表明您需要在多个存储过程中分解代码)。

工具的存在并不意味着它应该用于所有事物。

顺便说一下,FOR SELECT也是一个游标,除了你没有明确控制它(它隐藏了大部分的丑陋;)。

答案 1 :(得分:1)

另一种可能使用游标的情况是,当需要更新检索到的行时,查找或重新定位(确定确切的WHERE子句)行可能是个问题。在这种情况下,您可以使用FOR UPDATE子句打开游标,并使用WHERE CURRENT OF子句更新(或删除)行。