3

I am using FireDac to connect to my oracle database. To insert blob fields I use this code:

procedure TForm1.btn1Click(Sender: TObject);
begin
  try
    fdqry1.Open('select * from Tbl_Image where length(fld_content) > 0');
    try
      while not fdqry1.Eof do
      begin
        fdqry2.Close;
        fdqry2.SQL.Text:= 'insert into temp_blob (fld_ID, fld_CONTENT) values(:id, EMPTY_BLOB()) ' +
          'RETURNING fld_CONTENT INTO :content';
        fdqry2.Params[0].AsInteger:= fdqry1.FieldByName('fld_ID').AsInteger;
        fdqry2.Params[1].DataType:= ftOraBlob;
        fdqry2.Params[1].AsStream:= fdqry1.CreateBlobStream(fdqry1.FieldByName('fld_CONTENT'), bmRead);
        con1.StartTransaction;
        fdqry2.ExecSQL;
        con1.Commit;
        fdqry2.CloseStreams;

        fdqry1.Next;
      end;
    finally
      fdqry1.Close;
      fdqry2.Close;
    end;
  except on E: Exception do
  begin
    con1.Rollback;
    ShowMessage(E.Message);
  end;
  end;
end;

This code has no errors, but is not working. Why the target field is null?

1 Answers1

0

You assign blob value to output parameter in your code so it has no influence on value of fld_content column in your table. You must add the third parameter.

fdqry2.SQL.Text:= 'insert into temp_blob (fld_ID, fld_CONTENT) values(:id, :blob_val)) ' +
          'RETURNING fld_CONTENT INTO :content';
        fdqry2.Params[0].AsInteger:= fdqry1.FieldByName('fld_ID').AsInteger;
        fdqry2.Params[1].DataType:= ftOraBlob;
        fdqry2.Params[1].AsStream:= fdqry1.CreateBlobStream(fdqry1.FieldByName('fld_CONTENT'), bmRead);
        fdqry2.Params[2].DataType:= ftOraBlob;
jkp
  • 1