如何在PLSQL中使用相同的事务多功能

时间:2017-02-13 08:46:32

标签: oracle plsql transactions

我是PLSQL的新手。我需要帮助一点点。如何对主要功能子功能使用相同的交易。我的例子,如果打开注释行有效,但我想在Main函数中使用一个事务。可能吗?

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 个答案:

答案 0 :(得分:1)

在非常有限的情况下,您希望将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;
/