Oracle:查询中的DML操作

时间:2013-07-26 18:51:48

标签: oracle plsql oracle10g plsqldeveloper

我收到了这个错误:

cannot perform a DML operation inside a query

当我尝试执行查询时

select st_atten_up(1,7) from dual;

代码如下所示。

create or replace FUNCTION st_atten_up(stu_id IN student_info.id%type,app_mon IN student_attendence.month%type) 
RETURN NUMBER 
IS 
att1 NUMBER;
BEGIN SELECT ATTENDANCE into att1 FROM student_attendence 
WHERE student_attendence.id = stu_id and student_attendence.month = app_mon; 
att1 := att1 + 1;
UPDATE student_attendence SET ATTENDANCE = att1 
where id = stu_id and month = app_mon;
return att1;
END;

提前致谢。

2 个答案:

答案 0 :(得分:5)

如果调用的函数已声明为PRAGMA AUTONOMOUS_TRANSACTIONLink),则可以在select中从技术上执行DML。但是,出于多种好的理由(包括变异表,性能下降),从SELECT语句中执行DML是一个好主意很少。但是,为了回答你的问题,你可以用PRAGMA编写你的函数:

create or replace FUNCTION st_atten_up(stu_id IN student_info.id%type,app_mon IN student_attendence.month%type) 
RETURN NUMBER 
IS
PRAGMA AUTONOMOUS_TRANSACTION;
att1 NUMBER;
BEGIN SELECT ATTENDANCE into att1 FROM student_attendence 
WHERE student_attendence.id = stu_id and student_attendence.month = app_mon; 
att1 := att1 + 1;
UPDATE student_attendence SET ATTENDANCE = att1 
where id = stu_id and month = app_mon;
return att1;
END;

答案 1 :(得分:-1)

如果函数本身具有DML操作,则无法在DML中调用函数。

在这里,您将尝试在SELECT / UPDATE中调用该函数..这就是它给出错误的原因。如果您想这样做,请创建一个程序。