首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用FireDAC提取存储过程DDL

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

Stack Overflow用户
提问于 2018-08-23 15:02:24
回答 1查看 764关注 0票数 2

我正处于从FIBPlus到FireDAC的转换过程中,我需要的大多数功能都是在FireDAC中,我只是在努力寻找FIBPlus等效的TpFIBDBSchemaExtract和TpFIBScripter来将存储过程提取为DDL。

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

例如,如下所示:

代码语言:javascript
复制
SET TERM ^ ;

CREATE PROCEDURE MY_PROC RETURNS (aParam INTEGER) AS
BEGIN
  aParam = 10;
END^
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-23 15:17:08

FireDAC不支持(统一)获取存储过程的DDL定义(此时)。因此,您需要自己从RDB$PROCEDURE_SOURCE列的RDB$PROCEDURES表中获取DDL。例如(但不是理想的设计为连接对象助手):

代码语言:javascript
复制
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 DBMS时):

代码语言:javascript
复制
procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
begin
  S := FDConnection1.GetStoredProcCode('MyProcedure');
  ...
end;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51988831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档