0

私は次のようなことをしようとしています:

for(int i = 0; i<10; i++)
{
    for(int j = 0; j<10; j++)
    {
        Blah;
    }
}

//As you can see each time that there is a different i, j starts at 0 again.

Oracle でのカーソルの使用。しかし、私が正しければ、カーソルからすべての行をフェッチした後、再起動しません。これを行う方法はありますか?

ここに私のSQLがあります:

CREATE OR REPLACE PROCEDURE SSACHDEV.SyncTeleappWithClientinfo
as
teleCase NUMBER;

CURSOR TeleAppCursor
is
    Select 
        distinct(casenbr)
    from TeleApp;


CURSOR ClientInfoCursor
is
    Select casenbr 
    from clientinfo 
    where trim(cashwithappyn) is null;

BEGIN

    open TeleAppCursor;
    open ClientInfoCursor;

    LOOP
        fetch TeleAppCursor into teleCase;
        EXIT when TeleAppCursor%NOTFOUND;

        LOOP
            fetch ClientInfoCursor into clientCase;
            EXIT when ClientInfoCursor%NOTFOUND;
                if clientCase = teleCase then

                    update ClientInfo 
                    set cashwithappyn = (select cashwithappyn from teleapp where casenbr = clientCase) 
                    where casenbr = clientCase;

                    break;
                end if;
        END LOOP;
    END LOOP;

END;

私はオンラインでチェックしましたが、これについては何も見つかりませんでした。

4

2 に答える 2

3

カーソルを再起動する代わりに、テーブル変数を使用して sql ステートメントの結果を格納し、テーブルを任意の回数ループすることができます。

SQL Fiddle サンプル データを使用した例を次に示します。

DECLARE 
    CURSOR c1 IS 
      SELECT id, 
             TYPE, 
             details 
      FROM   supportcontacts; 

    TYPE contactrec 
      IS TABLE OF c1%ROWTYPE INDEX BY BINARY_INTEGER; 

    acontact    c1%ROWTYPE; 
    contactlist CONTACTREC; 
    counter     INTEGER; 
BEGIN 
    counter := 0; 

    OPEN c1; 

    LOOP 
        FETCH c1 INTO acontact; 

        IF c1%FOUND THEN 
          counter := counter + 1; 
        END IF; 

        Contactlist(counter) := acontact; 

        IF c1%NOTFOUND THEN 
          EXIT; 
        END IF; 
    END LOOP; 

    CLOSE c1; 



    FOR i IN 1..5 LOOP 
        FOR j IN 1..counter LOOP 
            dbms_output.Put_line(Contactlist(j).type  || ' ' || Contactlist(j).details); 
        END LOOP; 
    END LOOP; 
END; 

/ 

出力する

Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle

ここにSQLフィドルがありますが、dbms_outputからの出力を表示する方法がわかりません

于 2012-09-27T22:15:20.017 に答える
0

2 番目のカーソルはまったく必要ありません。Oracle のセット操作を使用して、自分で手動で検索せずに適切なレコードを更新するだけです。

DECLARE
    v_teleCase      TeleApp.teleCase%TYPE;
    v_cashwithappyn TeleApp.cashwithappyn%TYPE

    CURSOR TeleAppCursor
    is
        Select 
            distinct casenbr, cashwithappyn
        from TeleApp;

BEGIN

    open TeleAppCursor;

    LOOP
        fetch TeleAppCursor into v_teleCase, v_cashwithappyn;
        EXIT when TeleAppCursor%NOTFOUND;

        UPDATE ClientInfo
        SET cashwithappyn = v_cashwithappyn
        WHERE casenbr = v_teleCase
        AND trim(cashwithappyn) is null;

    END LOOP;

END;

列と同じ名前の変数を持たないことも良い考えです。

于 2012-09-27T22:29:09.800 に答える