FAQ VCL
Компоненты\FireDac\FDStoredProc

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как загрузить файл в БД 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;

При использовании материала - ссылка на сайт обязательна