PostgreSQL中如何调用存储过程并最终执行事务回滚?
问题分析与解决
错误原因
你写的脚本存在两个核心问题:
- 语法缺失:
DO匿名块的标准结构是DO $$ BEGIN ... END $$;,你的代码里遗漏了END关键字,同时ROLLBACK语句末尾没有加分号,导致PostgreSQL解析到最后的$$时无法识别,触发语法错误。 - 逻辑不允许:PostgreSQL的PL/pgSQL(包括
DO匿名块)不支持在函数/匿名块内部执行事务控制语句(比如ROLLBACK、COMMIT),因为这类代码运行在当前事务上下文内,无法自主控制事务边界。
正确实现方式
要满足调用存储过程后回滚的测试需求,无需使用DO块,直接手动控制事务即可:
BEGIN; CALL MyProcedure(); ROLLBACK;
在DBeaver控制台执行这段脚本的逻辑:
BEGIN;显式开启一个事务CALL MyProcedure();执行存储过程,所有数据变更都会被包含在当前事务中ROLLBACK;回滚整个事务,撤销存储过程执行的所有修改,达到测试目的
内容的提问来源于stack exchange,提问作者Victor Sotnikov
相关产品推荐
相关产品推荐

