如何读取PostgreSQL标准SQL函数的函数体?
解决PostgreSQL 14新语法函数体读取问题
这不是bug,是pg_get_expr的设计限制导致的。pg_get_expr只能处理表达式类型的语法节点,但PostgreSQL 14新语法创建的函数,其函数体存储在pg_proc.prosqlbody中,属于完整的SQL语句或语句块,并非表达式范畴,所以调用pg_get_expr会返回NULL或抛出“input is a query, not an expression”的错误。
正确的替代方法是使用PostgreSQL 14新增的pg_get_sql_body()函数——它就是专门为解析prosqlbody中的pg_node_tree类型数据设计的,能直接返回可读的纯净函数体SQL。
示例查询语句:
-- 获取指定函数的函数体内容 SELECT pg_get_sql_body(p.prosqlbody) AS function_body FROM pg_proc p WHERE p.proname = '你的函数名' -- 可选:加上函数签名过滤,避免同名函数冲突 AND pg_get_function_identity(p.oid) = '你的函数签名';
这个方法比用pg_get_functiondef获取完整创建语句再截取函数体要健壮得多,无需处理字符串解析的各种边缘情况,能直接拿到函数体的原始SQL内容,完全适配你生成数据库间更新脚本的需求——可以直接对比两个数据库中函数的解析结果,精准生成差异更新语句。
内容的提问来源于stack exchange,提问作者nyctef
相关产品推荐
相关产品推荐

