【问题标题】:Execute a rollback, after running a procedure运行过程后执行回滚
【发布时间】:2015-12-15 14:36:17
【问题描述】:

我在为查询创建单元测试时遇到问题。在 Java 方法中,它看起来像这样:

public String method () {
    StringBuilder query = new StringBuilder();
    query.append(" BEGIN  ");
    query.append(" <stored procedure name> ;");
    query.append(" END; " );
    return query.toString(); }

在测试方法中,它必须做一个回滚事务。对于经典的插入/删除/更新,它们是通过启动事务/回滚批量添加的。但我不确定它是否适用于存储过程,特别是如果它们包含在“开始”/“结束”中。我需要知道 PostgreSQL 的相同答案。

【问题讨论】:

  • 您不能“回滚”StringBuilder。看来您对事务模型有很深的误解。
  • 该方法返回StringBuilder的String值。 Statement 对象就是用这个字符串生成的。

标签: java postgresql unit-testing stored-procedures oracle-sqldeveloper


【解决方案1】:

对于初学者来说,Postgres 中没有存储过程。只有功能,几乎但不完全相同。 DO statement 或准备好的语句也可能对您有用。

特别是,函数始终是原子的并且在事务中运行。在调用它们的外部事务中,或者在它们自己的事务中。

是的,函数可以像任何其他 SQL 命令一样回滚。一些不能回滚的命令也不能嵌套在外部事务中(如CREATE DATABASE),因此也不能在函数内部使用。

BEGIN;
-- do something else
SELECT myfunc();
-- do something else
ROLLBACK;  -- everything back to the start (well, almost everything)

相关:

【讨论】:

  • 我需要 Java 的语法,将它们作为语句运行,并带有回滚事务。问题之一是如果在 Oracle 中,如果我输入:“begin end; rollback;”,则提交更新。我想知道单元测试是否可以将其作为回滚事务运行,而不删除“开始”和“结束”。
  • @CatalinVladu: ROLLBACK 仅在 BEGIN 开始交易之后才有意义。是的,函数会像任何其他 SQL 命令一样回滚。
  • 我知道函数/存储过程可以回滚。问题在于“开始/结束”。我在 SQL Developer 中输入“开始插入 ;结束;”并且事务已提交。这就是我问如何将包含“开始/结束”的块放入回滚事务的原因。
  • @CatalinVladu:不知道你在问什么。 plpgsql 函数的主体中有关键字BEGINEND。但是函数体是一个带引号的 string 并且您的客户端应该能够检测到它。也许您的客户不懂美元报价?像这种情况? stackoverflow.com/q/22747225/939860
  • 更新:Postgres 从版本 11 开始支持存储过程。
猜你喜欢
  • 2016-11-04
  • 2015-03-29
  • 1970-01-01
  • 2012-07-15
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多