我是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;
答案 0 :(得分:1)
在非常有限的情况下,您希望将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;
/