我正在尝试从表中获取最大日期变量,然后使用该变量将大于最大日期变量的记录插入到另一个表中。我已经创建了该过程并对其进行了测试,但是每次通过dbms_scheduler作为计划作业运行该过程时,它仅插入1条记录,以每30分钟运行一次。我的测试用例允许第一次运行插入6行,在第一个作业运行之后,它仅插入6条记录中的1条记录。然后下一次运行插入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;
您为什么要更改会话?您希望从中获得什么好处?
您编写的代码可以“简化”为
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能够处理轻松地。