在做一报表时,使用了一包体含了Insert语句的Select 查询语句出现cannot perform a DML operation inside a query信息。于是查找网上看了一些例子,并且自己做一个小Demo:
Create Or Replace Function dj_Insert__
Return Number
Is
temp_ Number;
Begin
Insert Into dj_import_data (s1) Values('Insert');
Commit;
Select Count(*) Into temp_
From dj_import_data;
Return temp_;
End dj_Insert__;
Select dj_Insert__
From dual;
SQL>
Select dj_Insert__
From dual
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "IFSAPP.DJ_INSERT__", line 7
这主要原因是Select 语句中不能对表进行任务DML操作,这在错误提示已明显提示。但Demo就往表Insert了数据,故提示信息。
其实要想在DQL进行DML操作可以使用自治事务(Autonomous Transactions)。自治事务是由另外一个事务调用,这个事务叫主事务。自治事务的提交和回滚并不影响主事务。
现在将Funtion dj_Insert__进行小改动:
Create Or Replace Function dj_Insert__
Return Number
Is
Pragma Autonomous_Transaction ;
temp_ Number;
Begin
Insert Into dj_import_data (s1) Values('Insert');
Commit;
Select Count(*) Into temp_
From dj_import_data;
Return temp_;
End dj_Insert__;
Select dj_Insert__
From dual;
SQL>
DJ_INSERT__
-----------
4
这个DQL语句正常使用。