Как загрузить файл в БД ORACLE используя внутренний поток (ссылку на BLOB, получаемую через параметр)?
// Тестовый пример:
// Схема: REPORT_SRV
// Пакет: PKG_TASK
// Процедура:
// PROCEDURE TEST_TASK(PAR_TASK_ID IN NUMBER, PAR_RESULT_DATA OUT BLOB) IS
// BEGIN
// INSERT INTO TBL_TASK
// (ID, RESULT_DATA)
// VALUES
// (PAR_TASK_ID, EMPTY_BLOB())
// RETURNING RESULT_DATA INTO PAR_RESULT_DATA;
// END;
// Способ первый
procedure TForm1.Button1Click(Sender: TObject);
var
s: TFileStream;
begin
s := TFileStream.Create('test.bin', fmOpenRead);
try
FDConnection1.StartTransaction;
try
with FDStoredProc1 do
begin
SchemaName := 'REPORT_SRV';
PackageName := 'PKG_TASK';
StoredProcName := 'TEST_TASK';
FetchOptions.Items := FetchOptions.Items - [fiMeta];
Params.CreateParam(ftFMTBcd, 'PAR_TASK_ID', ptInput);
ParamByName('PAR_TASK_ID').DataType := ftFMTBcd;
ParamByName('PAR_TASK_ID').AsFMTBCD := 18216377;
Params.CreateParam(ftStream, 'PAR_RESULT_DATA', ptOutput);
ParamByName('PAR_RESULT_DATA').DataType := ftStream;
ParamByName('PAR_RESULT_DATA').StreamMode := smOpenRead;
ExecProc;
ParamByName('PAR_RESULT_DATA').AsStream.CopyFrom(s, s.Size);
FDConnection1.Commit;
end;
except
FDConnection1.Rollback;
raise;
end;
finally
s.Free;
end;
end;
// Способ второй
procedure TForm1.Button1Click(Sender: TObject);
var
oStr: TFileStream;
oInt: TStream;
begin
with FDStoredProc1 do
begin
SchemaName := 'REPORT_SRV';
PackageName := 'PKG_TASK';
StoredProcName := 'TEST_TASK';
FetchOptions.Items := FetchOptions.Items - [fiMeta];
Params.CreateParam(ftFMTBcd, 'PAR_TASK_ID', ptInput);
ParamByName('PAR_TASK_ID').DataType := ftFMTBcd;
ParamByName('PAR_TASK_ID').AsFMTBCD := 18216377;
Params.CreateParam(ftStream, 'PAR_RESULT_DATA', ptOutput);
ParamByName('PAR_RESULT_DATA').DataType := ftStream;
ParamByName('PAR_RESULT_DATA').StreamMode := smOpenRead;
FDConnection1.StartTransaction;
try
ExecProc;
oStr := TFileStream.Create('test.bin', fmOpenRead);
try
{$IFDEF AUTOREFCOUNT}
oInt := ParamByName('PAR_RESULT_DATA').AsStream;
oInt.CopyFrom(oStr, -1);
oInt := nil;
{$ELSE}
ParamByName('PAR_RESULT_DATA').AsStream.CopyFrom(oStr, -1);
{$ENDIF}
finally
oStr.Free;
end;
CloseStreams;
FDConnection1.Commit;
except
FDConnection1.Rollback;
raise;
end;
end;
end;
|