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

PostgreSQL中如何调用存储过程并最终执行事务回滚?

问题分析与解决

错误原因

你写的脚本存在两个核心问题:

  1. 语法缺失:DO 匿名块的标准结构是 DO $$ BEGIN ... END $$;,你的代码里遗漏了END关键字,同时ROLLBACK语句末尾没有加分号,导致PostgreSQL解析到最后的$$时无法识别,触发语法错误。
  2. 逻辑不允许:PostgreSQL的PL/pgSQL(包括DO匿名块)不支持在函数/匿名块内部执行事务控制语句(比如ROLLBACK、COMMIT),因为这类代码运行在当前事务上下文内,无法自主控制事务边界。

正确实现方式

要满足调用存储过程后回滚的测试需求,无需使用DO块,直接手动控制事务即可:

BEGIN;
CALL MyProcedure();
ROLLBACK;

在DBeaver控制台执行这段脚本的逻辑:

  • BEGIN; 显式开启一个事务
  • CALL MyProcedure(); 执行存储过程,所有数据变更都会被包含在当前事务中
  • ROLLBACK; 回滚整个事务,撤销存储过程执行的所有修改,达到测试目的

内容的提问来源于stack exchange,提问作者Victor Sotnikov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:35:21