如何在Firebird 2.5中获取完整的DDL存储过程(输入/输出参数和主体)

问题描述 投票:0回答:1

我尝试从 Firebird 2.5 数据库检索完整的 DDL 存储过程,但结果不完整。

原来的存储过程源码是:

SET TERM ^ ;

create or alter procedure PREENCHE_EFETIVO
as
declare variable EMPRESA SYS_GLOBAL_EMPRESA;
declare variable FILIAL SYS_GLOBAL_FILIAL;
declare variable NUMERO CONTAS_RECEBER_NUMERO;
declare variable PREFIXO CONTAS_RECEBER_PREFIXO;
declare variable PARCELA CONTAS_RECEBER_PARCELA;
declare variable CLIENTE CLIENTES_CODIGO;
declare variable EFETIVO date;
BEGIN
FOR
    SELECT A.EMPRESA,A.FILIAL,A.NUMERO,A.PREFIXO,A.PARCELA,A.PROPRIETARIO,A.MOVIMENTACAO FROM MOVIMENTOS_BANCARIOS A INNER JOIN
    CONTAS_RECEBER B ON (A.EMPRESA=B.EMPRESA AND A.FILIAL=B.FILIAL AND A.NUMERO=B.NUMERO AND A.PREFIXO=B.PREFIXO
    AND A.PROPRIETARIO=B.CLIENTE AND A.PARCELA=B.PARCELA) INNER JOIN
    MANUTENCAO_COMISSOES C ON ( A.EMPRESA=C.EMPRESA AND A.FILIAL = C.FILIAL AND A.NUMERO=C.NUMERO AND
    A.PREFIXO=C.PREFIXO AND A.PARCELA=C.PARCELA AND A.PROPRIETARIO=C.CLIENTE ) INTO
    :EMPRESA, :FILIAL,:NUMERO, :PREFIXO,:PARCELA, :CLIENTE,:EFETIVO
    DO
    BEGIN
      UPDATE MANUTENCAO_COMISSOES SET EFETIVO=:EFETIVO WHERE
      EMPRESA=:EMPRESA AND FILIAL=:FILIAL AND NUMERO=:NUMERO AND PREFIXO=:PREFIXO AND PARCELA=:PARCELA AND
      CLIENTE=:CLIENTE;
    END
END^
SET TERM ; ^

这是用于获取源代码的SQL语句:

select RDB$PROCEDURE_SOURCE from RDB$PROCEDURES where RDB$SYSTEM_FLAG = 0

这是结果:

declare variable EMPRESA SYS_GLOBAL_EMPRESA;
declare variable FILIAL SYS_GLOBAL_FILIAL;
declare variable NUMERO CONTAS_RECEBER_NUMERO;
declare variable PREFIXO CONTAS_RECEBER_PREFIXO;
declare variable PARCELA CONTAS_RECEBER_PARCELA;
declare variable CLIENTE CLIENTES_CODIGO;
declare variable EFETIVO date;
BEGIN
FOR
    SELECT A.EMPRESA,A.FILIAL,A.NUMERO,A.PREFIXO,A.PARCELA,A.PROPRIETARIO,A.MOVIMENTACAO FROM MOVIMENTOS_BANCARIOS A INNER JOIN
    CONTAS_RECEBER B ON (A.EMPRESA=B.EMPRESA AND A.FILIAL=B.FILIAL AND A.NUMERO=B.NUMERO AND A.PREFIXO=B.PREFIXO
    AND A.PROPRIETARIO=B.CLIENTE AND A.PARCELA=B.PARCELA) INNER JOIN
    MANUTENCAO_COMISSOES C ON ( A.EMPRESA=C.EMPRESA AND A.FILIAL = C.FILIAL AND A.NUMERO=C.NUMERO AND
    A.PREFIXO=C.PREFIXO AND A.PARCELA=C.PARCELA AND A.PROPRIETARIO=C.CLIENTE ) INTO
    :EMPRESA, :FILIAL,:NUMERO, :PREFIXO,:PARCELA, :CLIENTE,:EFETIVO
    DO
    BEGIN
      UPDATE MANUTENCAO_COMISSOES SET EFETIVO=:EFETIVO WHERE
      EMPRESA=:EMPRESA AND FILIAL=:FILIAL AND NUMERO=:NUMERO AND PREFIXO=:PREFIXO AND PARCELA=:PARCELA AND
      CLIENTE=:CLIENTE;
    END
END

检索原始存储过程的正确方法是什么?这是需要的,因为我们必须通过我们的应用程序在运行时进行一些更改。

stored-procedures firebird
1个回答
0
投票

你不能直接这样做。 Firebird只存储存储过程的主体,而不是整个原始DDL。您需要根据数据库中存储的元数据自行对其进行逆向工程,或者使用可以为您完成此操作的库或工具。

例如,您需要查询

RDB$PROCEDURE_PARAMETERS
RDB$FIELDS
来获取存储过程的参数信息。

顺便说一句,如果您的应用程序需要对存储过程进行运行时修改,您可以将“原始”存储在应用程序本身中。

© www.soinside.com 2019 - 2024. All rights reserved.