ORA-14551: cannot perform a DML operation inside a query

在做一报表时,使用了一包体含了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语句正常使用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值