PostgreSQL函数select调用无数据插入,call调用正常的原因咨询
问题原因分析
核心问题出在PostgreSQL中存储过程(PROCEDURE)和函数(FUNCTION)的调用规则差异,结合你的场景具体拆解:
对象类型与调用语法不匹配:从你的调用结果反推,你实际定义的应该是
PROCEDURE而非FUNCTION。PostgreSQL 11+引入的存储过程(PROCEDURE)专门用于执行包含DML/DDL的操作,必须通过CALL语句调用;而函数(FUNCTION)要求必须有返回类型(哪怕是void),支持用SELECT调用。SELECT调用存储过程的无效性:如果强行用
SELECT调用PROCEDURE,PostgreSQL不会正确执行过程中的插入逻辑(或因事务上下文差异导致修改被隐性回滚),这就是select func_insert(100);无数据插入的原因。CALL调用的正确性:
CALL是PostgreSQL为PROCEDURE设计的专属调用语法,它会完整执行过程中的所有DML操作,在自动提交模式下执行完成后会自动提交事务,因此数据能成功插入到table_b中。
验证建议
你可以通过以下命令确认对象类型:
-- 查看是否为FUNCTION \df func_insert -- 查看是否为PROCEDURE \dp func_insert
如果确实是PROCEDURE,后续统一用CALL调用即可;如果是返回void的FUNCTION,用SELECT调用却未生效,再排查权限、table_a数据匹配等其他问题。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

