2017-02-13 63 views
-1

我是PLSQL的新手。我需要一點幫助。如何使用同一交易主要功能子功能。我的例子,如果開放註釋行的作品,但我想在主要功能使用一個事務。可能嗎?PLSQL中如何使用相同的事務多功能

CREATE OR REPLACE FUNCTION MAINFUNC(PAR1 IN NUMBER) 
RETURN VARCHAR2 
IS 
RITEM VARCHAR2 (1000); 
PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
INSERT INTO table_name 
     VALUES (value1,value2,value3,...); 
RITEM := SUBFUNCTION(PAR2); 
COMMIT; 
EXCEPTION 
ROLLBACK; 
END; 

子函數這裏:

CREATE OR REPLACE FUNCTION SUBFUNCTION(PAR2 IN NUMBER) 
    RETURN VARCHAR2 
    IS 
    RITEM VARCHAR2 (1000); 
    --PRAGMA AUTONOMOUS_TRANSACTION; 
    BEGIN 
    INSERT INTO table_name 
      VALUES (value1,value2,value3,...); 
    --COMMIT; 
    EXCEPTION 
    --ROLLBACK; 
    END; 
+1

什麼是真正的問題?你的代碼使用一個獨特的(自治)事務,這是因爲你在子功能中評論了提交和回滾,所以它完全符合你的要求。 – Massimo

+0

我也想使用主函數的子函數的事務,但我couldnt和我得到這個錯誤ORA-14552.But如果我提交的子函數的變化不要得到任何錯誤@Massimo –

+0

你爲什麼使主功能自主?這是非常非常少的必要或一個好主意。 –

回答

0

有非常有限的情況下,你會希望把a COMMIT statement在過程或函數,同樣有較少的情況下,你將作出AUTONOMOUS_TRANSACTION。對於大多數情況,您需要在調用過程/函數的事務中處理COMMITROLLBACK語句。

如果你想遞歸調用該函數然後就包括一些終止條件:

CREATE OR REPLACE FUNCTION MAINFUNC(
    PAR1 IN NUMBER, 
    DEPTH IN NUMBER DEFAULT 0 
) 
RETURN VARCHAR2 
IS 
    RITEM VARCHAR2 (1000); 
BEGIN 
    INSERT INTO table_name 
     VALUES (value1,value2,value3,...); 
    IF depth < 1 THEN 
    RITEM := MAINFUNC(PAR1, DEPTH + 1); 
    ELSE 
    RITEM := 'Some Value'; 
    END IF; 
END; 

然後你可以使用稱之爲:

DECLARE 
    RITEM VARCHAR2(1000); 
BEGIN 
    RITEM := MAINFUNC(42); 
    COMMIT; 
EXCEPTION 
    WHEN OTHERS THEN -- Use a more specific error code here 
    ROLLBACK 
END; 
/