Form中需要调用一个函数来产生单据号,却发现了这个警告:
ORA-14551:cannot perform a DML operation inside a query

原来,很多赋值语句,不是存储过程,而是一系列的SELECT语句。比如form个性化中的=my_func,实际上是

SELECT my_func INTO :MY_VAR FROM DUAL;

在SELECT时,系统会分析是否存在对表的插入、更新、修改等操作,默认是禁止此类行为的。如果必要,这时需要对函数做适当调整,加上PRAGMA AUTONOMOUS_TRANSACTION即可。如:

FUNCTION get_doc_num(p_doc_type   IN VARCHAR2,
                     p_given_date IN DATE DEFAULT SYSDATE) RETURN VARCHAR2 IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  ... ...
END get_doc_num;

常用的PRAGMA还有:
RESTRICT_REFERENCES
EXCEPTION_INIT
SERIALLY_REUSABLE