Oracle 插入过程仅插入 1 行而不是批量插入
Oracle insert procedure inserts only 1 row instead of bulk
我正在尝试从 table 中获取变量最大日期,然后使用该变量将记录插入另一个大于变量最大日期的 table。我已经创建了程序并对其进行了测试,但每次我 运行 程序作为计划作业从 dbms_scheduler 到 运行 每 30 分钟插入 1 条记录。我的测试用例允许第一个 运行 插入 6 行,在第一个作业 运行 之后它只插入了 6 条记录中的 1 条记录。然后下一个 运行 插入 1 条记录...等等。我正在测试它最终在概念上用于每 30 分钟插入附加几千行作为计划作业。 运行 这种类型的程序快速批量插入行的最有效方法是什么。我正在考虑将 table 更改为不记录并删除任何索引并在插入后重建它们。什么是最好的方法,提前谢谢你。
这是我的代码:
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;
你为什么要改变会话?您希望从中得到什么好处?
你写的代码可以"simplified"到
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 能够轻松。
我正在尝试从 table 中获取变量最大日期,然后使用该变量将记录插入另一个大于变量最大日期的 table。我已经创建了程序并对其进行了测试,但每次我 运行 程序作为计划作业从 dbms_scheduler 到 运行 每 30 分钟插入 1 条记录。我的测试用例允许第一个 运行 插入 6 行,在第一个作业 运行 之后它只插入了 6 条记录中的 1 条记录。然后下一个 运行 插入 1 条记录...等等。我正在测试它最终在概念上用于每 30 分钟插入附加几千行作为计划作业。 运行 这种类型的程序快速批量插入行的最有效方法是什么。我正在考虑将 table 更改为不记录并删除任何索引并在插入后重建它们。什么是最好的方法,提前谢谢你。
这是我的代码:
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;
你为什么要改变会话?您希望从中得到什么好处?
你写的代码可以"simplified"到
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 能够轻松。