【问题标题】:Firebird Cursors - Why would you use oneFirebird 光标 - 你为什么要使用一个
【发布时间】:2016-05-25 19:22:41
【问题描述】:

在文档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,因为它只是一个简单的选择语句。所以我想这个例子太简单了,无法展示它的好处。

【问题讨论】:

标签: sql firebird database-cursor


【解决方案1】:

您链接到的文档(及其newer 2.5 counterpart)已经包含了您会(或不会)使用游标的大部分原因(强调我的):

如果只需要游标来遍历结果集,使用带有AS CURSOR 子句的FOR SELECT 语句 几乎总是更容易且不易出错。声明的游标必须显式打开、用于获取数据并关闭。每次获取后必须检查上下文变量ROW_COUNT,如果它的值为零,则必须终止循环。 FOR SELECT 语句会自动检查它。

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-11-25
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      相关资源
      最近更新 更多