0

次のスクリプトがあります

DECLARE

CURSOR cursor1 IS
    SELECT *
    FROM table1;

TYPE cursor_aat IS TABLE OF cursor1%ROWTYPE;        

l_cursor cursor_aat;

BEGIN        
    OPEN cursor1;

    LOOP

        FETCH cursor1
        BULK COLLECT INTO l_cursor LIMIT 200;

        FOR INDX IN 1 .. l_cursor.COUNT LOOP            
            INSERT INTO new_table
            (col1, col2)
            values
            (l_cursor(INDX).col1, l_cursor(INDX).col2);

        END LOOP;

        EXIT WHEN l_cursor.COUNT < 200;
    END LOOP;

END;

しかし、それは認識しないと不平を言いl_cursor(INDX).col1ます。ここで何が間違っていますか?

4

1 に答える 1

1

そもそもなぜそのループを使用するのですか? これにより処理が遅くなり、サーバーで不要なリソースが消費されます。

PL/SQL スクリプト全体を 1 つのステートメントに置き換えることができます。

INSERT INTO new_table
(col1, col2)
SELECT col1, col2
FROM table1;

table1 から 200 行のみをコピーするには、次を使用します。

INSERT INTO new_table
(col1, col2)
SELECT col1, col2
FROM table1
WHERE rownum < 200;

行は SELECT ステートメントによって任意の順序で返される可能性があるため、どの行がコピーされるかは保証されないことに注意してください。特定の 200 行が必要な場合は、order by を適用する必要があります。

于 2012-09-19T19:13:25.503 に答える