1) DML ARRAY (https://www.devart.com/odac/docs/work_dml.htm)
Code: Select all
create global temporary table tbl_gtt
(
f1 varchar2(19 char),
f2 varchar2(64 char)
)
on commit preserve rows;
procedure TfmTest.ODACdmlarray(Sender: TObject);
var
OraQuery: TOraQuery;
RowQty, i: Integer;
begin
RowQty := 72735;
OraQuery := TOraQuery.Create(nil);
OraQuery.SQL.Text := 'INSERT INTO tbl_gtt VALUES (:f1, :f2)';
OraQuery.ParamByName('f1').DataType := ftString;
OraQuery.ParamByName('f1').Length := RowQty;
OraQuery.ParamByName('f2').DataType := ftString;
OraQuery.ParamByName('f2').Length := RowQty;
OraQuery.Prepare;
for i := 1 to RowQty do
begin
OraQuery.ParamByName('f1').ItemAsString[i] := '1234567890123456789';
OraQuery.ParamByName('f2').ItemAsString[i] := '1234567890123456789';
end;
OraQuery.Execute(RowQty);
end;
OK, lets try Batch Operations.
2) Batch Operations (https://www.devart.com/odac/docs/batchops.htm)
Code: Select all
create global temporary table tbl_gtt
(
f1 varchar2(19 char),
f2 varchar2(64 char)
)
on commit preserve rows;
procedure TfmTest.ODACbatch(Sender: TObject);
var
OraQuery: TOraQuery;
RowQty, i: Integer;
begin
RowQty := 72735;
OraQuery := TOraQuery.Create(nil);
OraQuery.SQL.Text := 'INSERT INTO tbl_gtt VALUES (:f1, :f2)';
OraQuery.Params[0].DataType := ftString;
OraQuery.Params[1].DataType := ftString;
OraQuery.Params.ValueCount := RowQty;
for i := 1 to RowQty do
begin
OraQuery.Params[0][i-1].AsString := '1234567890123456789';
OraQuery.Params[1][i-1].AsString := '1234567890123456789';
end;
OraQuery.Execute(40000);
OraQuery.Execute(32735, 40000);
end;
OK, lets try to pass an array to a procedure and insert through forall.
3) Array in Procedure
Code: Select all
create or replace package pkg_test is
type type_test is table of varchar2(19 char) index by pls_integer;
procedure proc
(
p_arr in type_test
);
end pkg_test;
create or replace package body pkg_test is
procedure proc
(
p_arr in type_test
)
is
begin
raise_application_error(-20999, 'Y');
end;
end pkg_test;
procedure TfmTest.ODACarrproc(Sender: TObject);
var
i, RowQty: Integer;
arr: array of Variant;
oProc: TOraStoredProc;
begin
RowQty := 65536;
SetLength(arr, RowQty);
for i := 1 to RowQty do
begin
arr[i-1] := '1234567890123456789';
end;
oProc:= TOraStoredProc.Create(nil);
oProc.StoredProcName:= 'pkg_test.proc';
oProc.Prepare;
oProc.Params[0].Value := arr;
oProc.Execute;
end;
4) TOraLoader works, but much slower than other methods (for 10k rows).
Please tell me what am I doing wrong? How can I load at least 500k rows into the database at maximum speed?