【问题标题】:WHERE CURRENT OF raising and invalid rowid errorWHERE CURRENT OF 引发和无效的 rowid 错误
【发布时间】:2014-05-21 11:42:00
【问题描述】:

我正在尝试将每个客户的年龄增加 1 并显示它们;使用光标。

这是表结构。

Select * from customers;

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |

这是我的代码:

DECLARE
   c_id customers.id%TYPE;
   c_name customers.name%TYPE;
   c_age customers.age%TYPE;

   CURSOR c1 IS
    SELECT id, name, age
      FROM customers
       FOR UPDATE OF salary;
BEGIN
   OPEN c1;
   LOOP
       FETCH c1 INTO c_id, c_name, c_age;
       UPDATE customers
       SET age = age + 1
       WHERE CURRENT OF c1;

       EXIT WHEN c1%NOTFOUND;
       dbms_output.put_line( c_id || ' ' || c_name || ' ' || c_age );
   END LOOP;
   CLOSE c1;
END;
/

但是,我收到以下错误:

Error report:
ORA-01410: invalid ROWID
ORA-06512: at line 13
01410. 00000 -  "invalid ROWID"
*Cause:    
*Action:
1 Ramesh 32
2 Khilan 25
3 kaushik 23
4 Chaitali 25
5 Hardik 27
6 Komal 22

为什么会发生这种情况,我该如何阻止它?

【问题讨论】:

  • 请格式化问题
  • 您可以建议编辑@rpax,这是 OP 的第一篇文章。自己制定问题的格式并为将来如何做提供指导可能会更有帮助。
  • 谢谢@rpax。我尝试从头开始对其进行格式化,但无能为力。任何格式化提示也会有所帮助。
  • @Ben 抱歉,我的手机很难编辑问题。 WamglindCarmasaic,你可以看看stackoverflow.com/editing-help
  • 表“客户”实际上是一个视图吗?

标签: oracle plsql cursor


【解决方案1】:

你的exit 放错地方了;它应该在fetch 之后。您正在正确处理您的六个真实行,但是您有第七次提取 - 之后 %notfound 将是 true - 所以没有“当前”行要更新。在尝试对该无效行执行任何操作之前,您需要退出。

BEGIN
   OPEN c1;
   LOOP
       FETCH c1 INTO c_id, c_name, c_age;
       EXIT WHEN c1%NOTFOUND;

       UPDATE customers
       SET age = age + 1
       WHERE CURRENT OF c1;

       dbms_output.put_line( c_id || ' ' || c_name || ' ' || c_age );
   END LOOP;
   CLOSE c1;
END;

希望这只是一个练习,因为它不是一种非常有效的更新方式。

【讨论】:

  • 谢谢亚历克斯。它现在工作正常。是的,这只是为了练习:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2021-08-29
  • 2021-05-07
  • 2016-01-09
  • 2017-05-16
相关资源
最近更新 更多