编写了一个oracle函数,函数体内实现一系列数据库的逻辑处理,涉及到数据的增删等操作,返回NCLOB类型。
然后通过查询方式调用函数:
SELECT PKG.MY_FUN('A') FROM DUAL;
执行该sql报错:ORA-14551: 无法在查询中执行 DML 操作
处理方式:将函数修改为自治事务。加上 PRAGMA AUTONOMOUS_TRANSACTION 语句
示例如下:
FUNCTION CALCULATE_MONTH_BONUS_DETAIL (CUR_MONTH IN NVARCHAR2) RETURN NCLOB IS PRAGMA AUTONOMOUS_TRANSACTION; CUR_MONTH_BILL_ID NUMBER (19); --固话单ID ... BEGIN ... COMMIT; RETURN RESULT_STR; END; END PKG_MONTH_TARGET; /
将事务设定为自治事务时,需要在函数体结尾出加入 COMMIT 或 ROLLBACK
如果未在结尾处提交或回滚,以查询方式执行时报错:ORA-06519: 检测到活动的自治事务处理,已经回退
参考文档: