Узнайте, какую версию django вы используете (, спасибо @BradyEmerso n):
python -c "import django; print(django.get_version())"
Если старше 1,8:
pip install --upgrade django
Я бы порекомендовал выбрать вариант, потому что курсоры занимают больше времени.
Кроме того, использование функции «Выбрать» намного проще для понимания тем, кому нужно изменить ваш запрос
Общее практическое правило таково: если вы можете сделать это с помощью одного оператора SQL вместо использования PL / SQL, вам следует это сделать. Обычно это будет более эффективно.
Однако, если вам нужно добавить больше процедурной логики (по какой-то причине), вам может потребоваться использование PL / SQL, но вы должны использовать массовые операции вместо построчной обработки. (Примечание: в Oracle 10g и более поздних версиях ваш цикл FOR будет автоматически использовать BULK COLLECT для выборки 100 строк за раз; однако ваш оператор вставки по-прежнему будет выполняться построчно).
например
DECLARE
TYPE tA IS TABLE OF FOO.A%TYPE INDEX BY PLS_INTEGER;
TYPE tB IS TABLE OF FOO.B%TYPE INDEX BY PLS_INTEGER;
TYPE tC IS TABLE OF FOO.C%TYPE INDEX BY PLS_INTEGER;
rA tA;
rB tB;
rC tC;
BEGIN
SELECT * BULK COLLECT INTO rA, rB, rC FROM FOO;
-- (do some procedural logic on the data?)
FORALL i IN rA.FIRST..rA.LAST
INSERT INTO BAR(A,
B,
C)
VALUES(rA(i),
rB(i),
rC(i));
END;
Вышеуказанное имеет преимущество минимизации переключений контекста между SQL и PL / SQL. Oracle 11g также имеет лучшую поддержку таблиц записей, так что вам не нужно иметь отдельную таблицу PL / SQL для каждого столбца.
Кроме того, если объем данных очень велик,
Если ваш сегмент отката / сегмент отмены может соответствовать размеру транзакции, то вариант 2 лучше. Вариант 1 полезен, если у вас нет необходимой мощности для отката и вам нужно разбить большую вставку на более мелкие коммиты, чтобы вы не получили слишком маленькие ошибки сегмента отката / отмены.
Простая вставка / выбор, такая как ваш второй вариант, намного предпочтительнее. Для каждой вставки в 1-м варианте вам потребуется переключение контекста с pl / sql на sql. Запустите каждый из них с помощью trace / tkprof и проверьте результаты.
Если, как упоминает Майкл, ваш откат не может обработать оператор, то пусть ваша база данных даст вам больше. Диск стоит дешево, в то время как частичные результаты, полученные при вставке данных за несколько проходов, потенциально могут быть довольно дорогими. (Отменить вставку практически невозможно.)