2012-03-16 3 views
2

Я новичок в PL/SQL, и я работаю над написанием объемной вставки. У меня есть вложенный курсор и внутри внутреннего курсора я хочу добавить записи в коллекцию, после чего я буду выполнять объемную вставку. Я создаю коллекцию как:Добавление в таблицу внутри курсора

TYPE mydata_tab IS TABLE OF mydata%ROWTYPE INDEX BY BINARY_INTEGER; 
v_mydata_tab mydata_tab; 

И тогда мои курсоры выглядеть следующим образом:

FOR rec_one IN cursor_one LOOP 

    strKey := rec_one.key; 

    FOR rec_two IN cursor_two LOOP 

    -- here is where I want to add a record to v_mydata_tab, that uses properties of both rec_one and rec_two 

    -- something like SELECT rec_one.key, rec_one.a, rec_two.b INTO v_mydata_tab; 

    END LOOP; 
END LOOP; 

Я играл с SELECT INTO и INSERT INTO, но не могу показаться, чтобы выяснить, как получить эту Работа.

ответ

1

Вы можете сделать это следующим образом:

n := 0; -- n is integer variable declared above 

FOR rec_one IN cursor_one LOOP 

    strKey := rec_one.key; 

    FOR rec_two IN cursor_two LOOP 

    n := n + 1; 
    v_mydata(n).key := rec_one.key; 
    v_mydata(n).a := rec_two.a; 
    v_mydata(n).b := rec_two.b; 

    END LOOP; 
END LOOP; 

Конечно, если вы можете комбинировать SQL из 2 курсоров в одну оператора выбора, вы могли бы сделать это вместо:

select x.key, y.a, y.b 
bulk collect into v_mydata 
from ...; 

Или если слишком много данных:

open cur; 
loop 
    fetch cur bulk collect into v_mydata limit 1000; 
    ... 
    exit when cur%notfound; 
end loop; 
close cur; 
+0

Спасибо! У меня нет возможности комбинировать SQL из-за моих фактических данных, но первый пример был именно тем, что мне нужно. – Paul

1

Вы просто используете назначение. rec_one и rec_two являются локальными переменными типа записи.

FOR rec_one IN cursor_one LOOP 

    strKey := rec_one.key; 

    FOR rec_two IN cursor_two LOOP 

    i := v_mydata_tab.COUNT+1; -- declare i above as local var 

    v_mydata_tab(i).key := rec_one.key; 
    v_mydata_tab(i).a := rec_one.a; 
    v_mydata_tab(i).b := rec_two.b; 

    END LOOP; 
END LOOP; 
+0

Мне нравится использовать COUNT, он делает код более читаемым. – Paul

Смежные вопросы