Java 在运行过程之后执行回滚

Java 在运行过程之后执行回滚,java,postgresql,unit-testing,stored-procedures,oracle-sqldeveloper,Java,Postgresql,Unit Testing,Stored Procedures,Oracle Sqldeveloper,我在为查询创建单元测试时遇到问题。在Java方法中,它如下所示: public String method () { StringBuilder query = new StringBuilder(); query.append(" BEGIN "); query.append(" <stored procedure name> ;"); query.append(" END; " ); return query.toString(); }

我在为查询创建单元测试时遇到问题。在Java方法中,它如下所示:

public String method () {
    StringBuilder query = new StringBuilder();
    query.append(" BEGIN  ");
    query.append(" <stored procedure name> ;");
    query.append(" END; " );
    return query.toString(); }
公共字符串方法(){
StringBuilder查询=新建StringBuilder();
查询。追加(“开始”);
查询。追加(“;”);
query.append(“END;”);
返回query.toString();}

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

对于初学者来说,Postgres中没有存储过程。只有函数,它们的功能几乎相同,但并不完全相同。一份或一份准备好的声明也可能对你有用

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

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

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


不能“回滚”
StringBuilder
。看起来您对事务模型有着深刻的误解。该方法返回StringBuilder的字符串值。语句对象是用这个字符串生成的。我需要Java的语法,以语句的形式运行它们,并使用回滚事务。其中一个问题是,如果在Oracle中,如果我输入:“begin-end;rollback;”,则会提交更新。我想知道单元测试是否可以将其作为回滚事务运行,而不删除“begin”和“end”。@CatalinVladu:
rollback
只有在
begin
启动事务后才有意义。是的,函数可以像任何其他SQL命令一样回滚。我知道函数/存储过程可以回滚。问题在于“开始/结束”。我输入了SQL Developer“begin insert;end;”并提交了事务。这就是我询问如何将包含“开始/结束”的块放入回滚事务的原因。@CatalinVladu:不确定你在问什么。plpgsql函数体中有关键字
BEGIN
END
。但是函数体是一个带引号的字符串,您的客户端应该能够检测到它。也许你的客户不懂美元报价?像这样吗?更新:Postgres自版本11起支持存储过程。