我尝试从 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
检索原始存储过程的正确方法是什么?这是需要的,因为我们必须通过我们的应用程序在运行时进行一些更改。
你不能直接这样做。 Firebird只存储存储过程的主体,而不是整个原始DDL。您需要根据数据库中存储的元数据自行对其进行逆向工程,或者使用可以为您完成此操作的库或工具。
例如,您需要查询
RDB$PROCEDURE_PARAMETERS
和RDB$FIELDS
来获取存储过程的参数信息。
顺便说一句,如果您的应用程序需要对存储过程进行运行时修改,您可以将“原始”存储在应用程序本身中。