如何在Firebird 2.5中获取完整的存储过程DDL(含参数与主体)
获取Firebird 2.5存储过程完整DDL的正确方法
Firebird的RDB$PROCEDURE_SOURCE字段本身只存储存储过程的主体代码(变量声明+执行逻辑),不包含CREATE OR ALTER开头的定义和SET TERM指令,所以得换方式获取完整DDL:
方法1:用Firebird自带的GEN_DDL存储过程
这是最省心的方式,Firebird内置的GEN_DDL可以直接生成包含完整创建声明的存储过程DDL。调用示例:
SELECT DDL FROM GEN_DDL('PROCEDURE', '你的存储过程名称')
返回的结果会包含CREATE OR ALTER PROCEDURE开头的完整定义,以及参数、主体代码,直接就能用来修改存储过程。
方法2:手动拼接DDL(如果不想依赖GEN_DDL)
如果需要自己控制生成逻辑,可以从系统表拼接完整语句:
- 获取存储过程的基本信息和参数:
SELECT p.RDB$PROCEDURE_NAME, pp.RDB$PARAMETER_NAME, pp.RDB$PARAMETER_TYPE, -- 0=输入参数,1=输出参数 ft.RDB$TYPE_NAME, pp.RDB$FIELD_LENGTH, pp.RDB$FIELD_PRECISION FROM RDB$PROCEDURES p JOIN RDB$PROCEDURE_PARAMETERS pp ON p.RDB$PROCEDURE_NAME = pp.RDB$PROCEDURE_NAME JOIN RDB$FIELD_TYPES ft ON pp.RDB$FIELD_TYPE = ft.RDB$FIELD_TYPE AND COALESCE(pp.RDB$FIELD_SUB_TYPE, 0) = ft.RDB$FIELD_SUB_TYPE WHERE p.RDB$SYSTEM_FLAG = 0 AND p.RDB$PROCEDURE_NAME = '你的存储过程名称' ORDER BY pp.RDB$PARAMETER_NUMBER - 拼接创建语句:
先拼CREATE OR ALTER PROCEDURE 存储过程名 (,然后把参数按参数名 类型 [OUTPUT]的格式拼接,接着加AS,最后把RDB$PROCEDURE_SOURCE的内容接在后面。
关于SET TERM的说明
SET TERM是客户端工具(比如IBExpert、FlameRobin)用来临时改变SQL语句终止符的指令,Firebird服务器本身并不执行这个指令,所以系统表不会存储它。如果你的应用需要生成带SET TERM的脚本,自己在生成的DDL前后加上即可,比如:
SET TERM ^ ; CREATE OR ALTER PROCEDURE 你的存储过程名 (...) AS BEGIN -- 存储过程主体 END^ SET TERM ; ^
内容的提问来源于stack exchange,提问作者Thiago Rodrigo da Silva
相关产品推荐
相关产品推荐

