В базе есть пакет с одной процедурой
Код: Выделить всё
create or replace type "INT_ARRAY" is table of integer;
create or replace package test_table is
procedure test(ARM_IDs in int_array);
end test_table;
/
create or replace package body test_table is
procedure test(ARM_IDs in int_array) is
begin
null;
null;
end;
end test_table;
/
Код: Выделить всё
unit TestTable;
interface
uses
{$IFDEF MSWINDOWS} Windows,{$ENDIF} SysUtils, Classes, DB, DBAccess, Ora, OraPackage,
FMTBcd, OraClasses, OraObjects, OraCall;
type
TSystem_Test_Table = class(TCustomOraPackage)
public
constructor Create(AOwner: TComponent); override;
procedure Test(const Arm_Ids: TOraNestTable);
end;
implementation
{ TSystem_Test_Table }
constructor TSystem_Test_Table.Create(AOwner: TComponent);
begin
inherited;
PackageName := 'SYSTEM.TEST_TABLE';
end;
procedure TSystem_Test_Table.Test(const Arm_Ids: TOraNestTable);
var
Arm_Ids_Param: TOraParam;
begin
BeginExecPLSQL;
try
Arm_Ids_Param := AddParam('ARM_IDS', ftDataSet, ptInput);
Arm_Ids_Param.AsTable := Arm_Ids;
ExecProc('TEST');
finally
EndExecPLSQL;
end;
end;
end.
Код: Выделить всё
program Project2;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
TestTable in 'TestTable.pas';
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := True;
Если не закоментированно то появляется ошибка на System_Test_Table.Free;An unexpected memory leak has occurred. The unexpected small block leaks are:
1 - 12 bytes: Unknown x 4
53 - 60 bytes: TOraNestTable x 2
TOraType.Free RefCount = 0 (D:\Projects\Delphi\Dac\Common\Source\MemData.pas, line 8698)
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
Table: TOraNestTable;
i: Integer;
begin
Table := TOraNestTable.Create(TOraType.Create(OraSession1.OCISvcCtx, 'INT_ARRAY'));
i := Table.AppendItem;
Table.ItemAsInteger[i]:= 2;
i := Table.AppendItem;
Table.ItemAsInteger[i]:= 3;
i := Table.AppendItem;
Table.ItemAsInteger[i]:= 4;
System_Test_Table.Test(Table);
Table.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OraSession1.Server := '';
OraSession1.Password := '';
OraSession1.Username := '';
OraSession1.Connect;
System_Test_Table := TSystem_Test_Table.Create(nil);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
OraSession1.Disconnect;
System_Test_Table.Free;
//тоже самое с System_Test_Table.Params.Clear;
end;
В приложении исходный код примера.