2017-02-13 19 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

Я хочу использовать транзакцию основной функции для вспомогательной функции тоже, но я не могу и я получаю эту ошибку ORA-14552. Но если я совершил изменения в подфункции, не получаю никакой ошибки @Massimo –

+0

Почему вы сделали основную функцию автономной? Это очень редко необходимо или хорошая идея. –

ответ

0

Есть очень ограниченные случаи, когда вы хотите поставить a COMMIT statement в процедуре или функции, и так же есть меньше случаев, когда вы будете делать в AUTONOMOUS_TRANSACTION. В большинстве случаев вам нужно будет обрабатывать операторы COMMIT и ROLLBACK в транзакции, которая вызывает процедуру/функцию.

Если вы хотите, чтобы вызвать функцию рекурсивно, то просто включить некоторые завершающее состояние:

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; 
/