1

这就是我想要实现的目标:

  1. 定义一个游标

  2. 它返回我的行列表

  3. 使用行做一些修改表

  4. 重复 2 和 3 直到光标没有返回结果。

这就是我到目前为止所做的

DECLARE
  CURSOR c1 IS
    [My SQL HERE];

BEGIN

   FOR r1 in c1 LOOP
   [modify tables]

END; 

问题是我把时间放在哪里?我会在 for 循环之前这样做。但是 pl/sql 中描述 c1 的语法是什么?

请注意,在 c1 完全完成后,我需要重新运行光标代码。进行另一次迭代。因为结果会不一样。这就是为什么我需要一段时间

4

3 回答 3

2

答案是将“while”与“for”结合起来。显然,仅当您想多次运行游标时,因为您正在更新/更改游标内部的某些内容,并且条件发生了变化,因此您需要再次重新运行游标。

这是基本结构:

 DECLARE
  CURSOR c1 IS
    [My SQL HERE];

BEGIN

   WHILE CONDITION LOOP

   FOR r1 in c1 LOOP
   [modify tables]
   END LOOP; -- for loop

   [Check The Condition]

   END LOOP; -- while loop

 END; 

例如

  DECLARE

  counts NUMBER := -1;
  CURSOR c1 IS
    [Statement Here];

BEGIN

   WHILE count != 0 LOOP

   FOR r1 in c1 LOOP
   [modify tables]
   END LOOP; -- for loop

   SELECT count(*) ...... INTO counts

   END LOOP; -- while loop

END; 
于 2012-09-13T12:49:37.353 回答
0

您不需要单独的WHILE. 将FOR ... LOOP遍历游标返回的行:

FOR r1 IN c1 LOOP
    -- r1 is the current row from the cursor
END LOOP;

有两种处理游标的方法,所以这可能会引起混淆;另一种方法是:

OPEN c1;
LOOP
    FETCH c1 INTO r1; -- where r1 is declared
    EXIT WHEN c1%NOTFOUND;
    -- do something with r1
END LOOP;
CLOSE c1;

就个人而言,我通常发现FOR ... LOOP语法更简单。

于 2012-09-13T11:34:16.830 回答
0

首先,我建议考虑没有游标的常规更新,因为它们中最好的部分是较慢的。我也不明白你想用 WHILE 代替 FOR 什么。它们的工作方式几乎相似。无论如何,最好的建议来源是 Oracle 的文档http://docs.oracle.com/cd/B14117_01/appdev.101/b10807/13_elems020.htm

于 2012-09-13T11:32:22.177 回答