Процедура вставки Oracle вставляет только 1 строку вместо основной - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь получить переменную максимальную дату из таблицы, а затем использовать эту переменную, чтобы вставить записи в другую таблицу, которые больше, чем переменная максимальная дата. Я создал процедуру и протестировал ее, но она вставляет только 1 запись каждый раз, когда я запускаю процедуру как запланированное задание через dbms_scheduler для запуска каждые 30 минут. Мой тестовый пример позволил при первом запуске вставить 6 строк, после первого запуска задания была вставлена ​​только 1 запись из 6 записей. Затем при следующем запуске вставляется 1 запись ... и т. Д. Я тестирую это, чтобы в конечном итоге использовать его для добавления и добавления нескольких тысяч строк каждые 30 минут в качестве запланированного задания. Каков наиболее эффективный способ быстро выполнить этот тип процедуры и массово вставить строки. Я думал о том, чтобы изменить таблицу на nologging и отбросить любые индексы и перестроить их после вставки. Какой самый лучший подход, заранее спасибо.

Вот мой код:

create or replace procedure update_cars
AS
v_date date;
begin
execute immediate 'alter session set NLS_DATE_FORMAT='DD-MON-YY HH24:MI:SS'';
select max(inventory_date) into v_date from car_equipment;
insert /*+APPEND*/ into car_equipment(count_cars,equipment_type,location,inventory_date,count_inventory) 
select count_cars,equipment_type,location,inventory_date,count_inventory 
from car_source where inventory_date > v_date;
end;

1 Ответ

1 голос
/ 03 октября 2019

Почему вы меняете сессию? Какую выгоду вы ожидаете от этого?

Код, который вы написали, может быть "упрощен" до

create or replace procedure update_cars
as 
begin
  insert into car_equipment (count_cars,, equipment_type, ...)
    select s.count_cars, s.equipment_type, ...
    from car_source s
    where inventory_date > (select max(e.inventory_date) from car_equipment e);
end;

Если код вставляет только одну строку, то проверьте значения даты как из car_equipment, так и car_source столы. Без примеров данных я бы сказал, что с кодом все в порядке (по крайней мере, для меня это выглядит нормально).

Если вы будете вставлять несколько тысяч строк каждые 30 минут, этого не должно бытьпроблема, поскольку Oracle способен легко справиться с этим .

...