Как извлечь хранимую процедуру DDL с помощью FireDAC
Я нахожусь в процессе перехода с FIBPlus на FireDAC, и большинство функциональных возможностей, которые мне нужны, находятся в FireDAC, я просто пытаюсь найти FIBPlus эквивалент TpFIBDBSchemaExtract и TpFIBScripter для извлечения хранимых процедур в виде DDL.
Есть ли у FireDAC способ извлечения хранимой процедуры DDL из базы данных?
Например, будет выглядеть так:
SET TERM ^ ;
CREATE PROCEDURE MY_PROC RETURNS (aParam INTEGER) AS
BEGIN
aParam = 10;
END^
1 ответ
Решение
FireDAC не поддерживает (унифицированную) выборку определений DDL хранимых процедур (в настоящее время). Итак, вам нужно извлечь этот DDL из таблицы RDB$PROCEDURES, столбца RDB$PROCEDURE_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;
Использование тогда (когда вы подключены к СУБД Firebird):
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
begin
S := FDConnection1.GetStoredProcCode('MyProcedure');
...
end;