FireDac

时间:2016-01-01 17:55:43

标签: oracle insert blob firedac

我正在使用FireDac连接到我的oracle数据库。 要插入blob字段,我使用以下代码:

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;

此代码没有错误,但无法正常工作。为什么目标字段为空?

1 个答案:

答案 0 :(得分:0)

您可以将blob值分配给代码中的输出参数,这样它就不会影响表中fld_content列的值。您必须添加第三个参数。

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;