我收到了这个错误:
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;
提前致谢。
答案 0 :(得分:5)
如果调用的函数已声明为PRAGMA AUTONOMOUS_TRANSACTION
(Link),则可以在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中调用该函数..这就是它给出错误的原因。如果您想这样做,请创建一个程序。