 |
|
ORA-14551: cannot perform a DML operation inside a query tips
Oracle Error Tips by Stephanie F.
|
The Oracle docs note this on the
ora-14551 error:
- ORA-14551
cannot perform a DML operation inside a query
- Cause:
DML operation like insert, update, delete or select-for-update cannot be
performed inside a query or under a PDML slave.
-
- Action:
Ensure that the offending DML operation is not performed or use an
autonomous transaction to perform the DML operation within the query or
PDML slave.
Internet sources offer information regarding ORA-14551. Here are the details of
the error:
You get ORA-14551 when selecting a PL/SQL
or Java Stored Procedure from dual.
i.e.
Myfunction looks like this
create or replace function
myFunction return varchar2 as
begin
update emp set empno = empno +1 where empno = 0;
return 'Yeah';
end;
/
SQL> insert into emp (empno, ename) values (0, 'TEST');
1 row created.
SQL> var myVar VARCHAR2
SQL> SELECT myFunction INTO :myVar FROM DUAL;
SELECT myFunction INTO :myVar FROM DUAL
*
ERROR at line 1:
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "SCOTT.MYFUNCTION", line 3
ORA-06512: at line 1
The solution concerns using different syntax,
such as below:
You need to use the syntax:
SQL> var myVar VARCHAR2
SQL> call myFunction() INTO :myVar;
Call completed.
-- Paranthesis are must in the above call.
The reason for ORA-14551 has to do with
restrictions of doing DMLs from in a select statement, "The function myFunction
has within its code some form of
DML, (INSERT, UPDATE or DELETE). Functions may only do selects and
still be callable from DUAL or used in any form of select."
Also important to note:
The error ORA-14551 is new in 8i databases
and may have resulted in
ORA-6571 in prior versions.