Sql 如何识别光标中的一行?

Sql 如何识别光标中的一行?,sql,database,oracle,plsql,Sql,Database,Oracle,Plsql,光标是否在内部计算?在为循环执行光标时,是否有任何方法可以识别光标的当前行 我正在更新一个表,我希望在与光标当前行相等的行中进行更新。大概是这样的: DECLARE CURSOR c is -- (...) BEGIN FOR reg IN c LOOP UPDATE table SET column = 'abc' WHERE ROWNUM = -- current line of the cursor END LOOP; END; 您

光标是否在内部计算?在为循环执行光标时,是否有任何方法可以识别光标的当前行

我正在更新一个表,我希望在与光标当前行相等的行中进行更新。大概是这样的:

DECLARE
  CURSOR c
  is
  -- (...)
BEGIN
  FOR reg IN c
  LOOP
    UPDATE table
       SET column = 'abc'
     WHERE ROWNUM = -- current line of the cursor
  END LOOP;
END;

您可以在oracle中使用集合类型而不是游标。 更具体地说,您要查找的是表索引或关联数组


有关如何使用它们的更多详细信息是和。

其中ROWNUM=?
永远不会起作用(除了?=1)

ROWNUM在Oracle中的工作方式是,它仅在实际选中行时才递增。因此,在第一行到达1之前,它永远无法到达2(这是因为“第一”行的ROWNUM=2)

唯一有用的条件是
ROWNUM<?
(这并不像您想象的那么有用,因为它是在
orderby
之前应用的)


即使有效,如果没有订单,您也会遇到极其不可预测的结果


对于实际提出的问题,可以使用光标的
%ROWCOUNT
属性


c%ROWCOUNT
提供到目前为止获取的行数。

如果在查询中使用相同的
where
更新语句,效果会更好。我看不出这种情况在数据集中能正常工作。因为每次运行的行不相同,我不能使用相同的WHERE语句,因为游标正在考虑表中不存在的新“字段”。因此,使用游标FOR循环永远不会是这种情况的解决方案?没有更多上下文,很难说。在光标中没有主键ID可以用来更新吗?你真的需要游标吗(而不是更新位置)?我使用游标,因为我认为它是获取、保存和更新数据的最佳解决方案。这里的问题是:我找不到一种方法来标识游标正在获取的每一行,因此我使用的UPDATE WHERE子句只更新表中的一行,其中包含循环正在检索的所有数据。您能给我一个与我发布的代码相关的小示例吗?