1

我在創建查詢的單元測試時遇到問題。在Java方法中,它看起來像這樣:運行過程後執行回滾

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

在測試方法中,它必須執行回滾事務。對於經典的插入/刪除/更新,它們是以開始事務/回滾批量添加的。但我不確定它是否適用於存儲過程,特別是如果它們包含在「開始」/「結束」中。我需要知道PostgreSQL的相同答案。

+1

你不能 「回滾」'StringBuilder'。看起來你對事務模型有着深刻的誤解。 – Andremoniy

+0

該方法返回StringBuilder的String值。而Statement對象是由這個字符串組成的。 –

回答

0

對於初學者來說,Postgres中沒有存儲過程。只有功能幾乎但不完全相同。 A DO statement或準備好的聲明也可能適用於您。

特別是,函數總是原子的,並在事務內運行。在他們被調用的外部交易中,或者在他們自己的交易中。

,函數可以像任何其他SQL命令一樣回滾。一些無法回滾的命令也不能嵌套在外部事務中(如CREATE DATABASE),因此不能在函數內部使用。

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

相關:

+0

我需要Java的語法,通過回滾事務將它們作爲語句運行。其中一個問題是如果在Oracle中,如果我輸入:「begin end; rollback;」,則提交更新。我想知道單元測試是否可以將此作爲回滾事務運行,而不刪除「開始」和「結束」。 –

+0

@CatalinVladu:在'BEGIN'開始交易之後'ROLLBACK'纔有意義。是的,函數像任何其他SQL命令一樣回滾。 –

+0

我知道函數/存儲過程可以回滾。問題在於「開始/結束」。我放入SQL Developer「開始插入< anything >;結束;」並且交易已經完成。這是我詢問如何將包含「begin/end」的塊置於回滾事務中的原因。 –