Delphi 如何使用FireDAC提取存储过程DDL

Delphi 如何使用FireDAC提取存储过程DDL,delphi,firebird,firedac,fibplus,Delphi,Firebird,Firedac,Fibplus,我正在从FIBPlus转换为FireDAC,我需要的大部分功能都在FireDAC中,我只是在努力寻找FIBPlus与TpFIBDBSchemaExtract和TpFIBScripter的等价物,以便将存储过程提取为DDL FireDAC是否有从数据库中提取存储过程DDL的方法 例如,它看起来像: SET TERM ^ ; CREATE PROCEDURE MY_PROC RETURNS (aParam INTEGER) AS BEGIN aParam = 10; END^ FireDAC

我正在从FIBPlus转换为FireDAC,我需要的大部分功能都在FireDAC中,我只是在努力寻找FIBPlus与TpFIBDBSchemaExtract和TpFIBScripter的等价物,以便将存储过程提取为DDL

FireDAC是否有从数据库中提取存储过程DDL的方法

例如,它看起来像:

SET TERM ^ ;

CREATE PROCEDURE MY_PROC RETURNS (aParam INTEGER) AS
BEGIN
  aParam = 10;
END^
FireDAC目前不支持(统一)获取存储过程的DDL定义。因此,您需要自己从表RDB$PROCEDURE\u SOURCE列中获取DDL。例如(虽然不是理想的连接对象辅助对象设计):


但是,此列可以在数据库开发人员创建SP后清除。@arich,那么您也可以使用FIBPlus,因为它在内部查询
RDB$PROCEDURE\u SOURCE
uses
  FireDAC.Stan.Util;

type
  TFDConnectionHelper = class helper for TFDConnection
  public
    function GetStoredProcCode(const AName: string): string;
  end;

implementation

{ TFDConnectionHelper }

function TFDConnectionHelper.GetStoredProcCode(const AName: string): string;
var
  Table: TFDDatSTable;
  Command: IFDPhysCommand;
begin
  CheckActive;
  if RDBMSKind <> TFDRDBMSKinds.Firebird then
    raise ENotSupportedException.Create('This feature is supported only for Firebird');

  Result := '';
  ConnectionIntf.CreateCommand(Command);

  Command.CommandText := 'SELECT RDB$PROCEDURE_SOURCE FROM RDB$PROCEDURES WHERE RDB$PROCEDURE_NAME = :Name';
  Command.Params[0].DataType := ftString;
  Command.Params[0].Size := 31;
  Command.Params[0].AsString := UpperCase(AName);

  Table := TFDDatSTable.Create;
  try
    Command.Define(Table);
    Command.Open;
    Command.Fetch(Table);

    if Table.Rows.Count > 0 then
      Result := Table.Rows[0].GetData(0);
  finally
    FDFree(Table);
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
begin
  S := FDConnection1.GetStoredProcCode('MyProcedure');
  ...
end;