Как загрузить файл в БД 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
FDQuery1.SQL.Text := 'begin REPORT_SRV.PKG_TASK.TEST_TASK(:PAR_TASK_ID, :PAR_RESULT_DATA); end;';
FDQuery1.ParamByName('PAR_TASK_ID').DataType := ftFMTBcd;
FDQuery1.ParamByName('PAR_TASK_ID').ParamType := ptInput;
FDQuery1.ParamByName('PAR_TASK_ID').AsFMTBCD := 18216377;
FDQuery1.ParamByName('PAR_RESULT_DATA').DataType := ftStream;
FDQuery1.ParamByName('PAR_RESULT_DATA').ParamType := ptOutput;
FDQuery1.ParamByName('PAR_RESULT_DATA').StreamMode := smOpenRead;
FDQuery1.ExecSQL;
FDQuery1.ParamByName('PAR_RESULT_DATA').AsStream.CopyFrom(s, s.Size);
FDConnection1.Commit;
except
FDConnection1.Rollback;
raise;
end;
finally
s.Free;
end;
end;
// Способ второй
procedure TForm1.Button1Click(Sender: TObject);
var
oStr: TFileStream;
begin
FDConnection1.StartTransaction;
try
FDQuery1.SQL.Text := 'begin REPORT_SRV.PKG_TASK.TEST_TASK(:PAR_TASK_ID, :PAR_RESULT_DATA); end;';
FDQuery1.ParamByName('PAR_TASK_ID').DataType := ftFMTBcd;
FDQuery1.ParamByName('PAR_TASK_ID').ParamType := ptInput;
FDQuery1.ParamByName('PAR_TASK_ID').AsFMTBCD := 18216377;
FDQuery1.ParamByName('PAR_RESULT_DATA').DataType := ftStream;
FDQuery1.ParamByName('PAR_RESULT_DATA').StreamMode := smOpenWrite;
FDQuery1.ExecSQL;
oStr := TFileStream.Create('test.bin', fmOpenRead);
try
{$IFDEF AUTOREFCOUNT}
oInt := FDQuery.Params[0].AsStream;
oInt.CopyFrom(oStr, -1);
oInt := nil;
{$ELSE}
FDQuery1.ParamByName('PAR_RESULT_DATA').AsStream.CopyFrom(oStr, -1);
{$ENDIF}
finally
oStr.Free;
end;
FDQuery1.CloseStreams;
FDConnection1.Commit;
except
FDConnection1.Rollback;
raise;
end;
end;
|