2017-04-27 41 views
1

在我的PLSQL函数中,为了将日志记录到日志表,我正在调用一个过程(它包含commit语句)。因此,我宣布它作为PLSQL:ORA-14552无法执行DDL,提交

CREATE OR REPLACE PROCEDURE PR_LOGGER 
(IN PARAMETERS-----) 
IS Pragma Autonomous_transaction 
BEGIN 

--Insert statements 

Commit; 
END; 

调用函数:

CREATE OR REPLACE FUNCTION MYFUNCTION 
(--IN PARAMETERS) 
BEGIN 

---Some select statements 
PR_LOGGER(logmessage); 
BEGIN 
EXECUTE IMMEDIATE 'DROP TABLE tablename'; 
EXCEPTION WHEN OTHERS 
    IF (SQLCODE !=942) THEN 
    PR_LOGGER(SQLERRM); 
    END IF; 
END; 
return NULL; 
END; 

让我明白,如果调用过程或函数包含承诺,我将得到ORA-14552,但即使我我交给它作为附注AUTONOMOUS_TRANSACTION到避免那个错误,我仍然得到相同的错误。任何想法我做错了什么?请指教。

回答

3

DROP TABLE语句会导致隐式提交。

PRAGMA仅适用于执行PROCEDURE

DROP TABLE不在过程的上下文中执行。这是在FUNCTION的上下文中执行的。

+0

谢谢你的回应。我应该不是在我的函数里面使用drop table吗?你能建议最好的方法吗 – Karthik

+0

没错。不要在FUNCTION的上下文中执行DDL操作。你已经想出了如何使用自主事务进行提交。你可以用DROP TABLE做同样的事情。将其放入PROCEDURE中,并从FUNCTION调用该过程。 – spencer7593

+0

非常感谢:)请试试 – Karthik