用于插入数据的Oracle批量收集脚本

时间:2012-09-19 15:45:04

标签: oracle bulk oracle-cursor bulk-collect

我有以下脚本

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。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

为什么你首先使用那个循环?它减慢了速度并在服务器上创建了不必要的资源消耗。

整个PL / SQL脚本可以用一个语句替换:

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个特定行,则需要按顺序应用订单。