Добавление в таблицу внутри курсора - PullRequest
2 голосов
/ 16 марта 2012

Я новичок в 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, но не могу понять, как заставить это работать.

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Вы просто используете назначение.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;
1 голос
/ 16 марта 2012

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

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 двух курсоров в один оператор выбора, вы можете сделать это вместо этого:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...