1

これは私が達成しようとしていることです:

  1. カーソルを定義する

  2. 行のリストを返します

  3. 行を使用してテーブルを変更します

  4. カーソルが結果を返さなくなるまで、2と3を繰り返します。

これは私がこれまでにしたことです

DECLARE
  CURSOR c1 IS
    [My SQL HERE];

BEGIN

   FOR r1 in c1 LOOP
   [modify tables]

END; 

質問はどこに置くのですか?forループの前にそれを行います。しかし、c1を記述するためのpl / sqlの構文はどうなっていますか?

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;

カーソルを処理する方法は2つあるので、おそらくそれが混乱を引き起こします。代替案は次のようなものです。

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

まず、カーソルの大部分が遅いので、カーソルなしの従来の更新について考えることをお勧めします。また、FORをWHILEに置き換えたいのかわかりません。それらはほぼ同じように機能します。いずれにせよ、アドバイスの最良の情報源は、Oracleのドキュメントhttp://docs.oracle.com/cd/B14117_01/appdev.101/b10807/13_elems020.htmです。

于 2012-09-13T11:32:22.177 に答える