You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:42:46