【发布时间】:2011-11-10 13:34:01
【问题描述】:
为什么会出现以下错误?
Error starting at line 1 in command:
select FUNC from dual
Error report:
SQL Error: ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "ANONYMOUS.FUNC", line 15
14551. 00000 - "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.
功能:
create or replace function FUNC
return types.ref_cursor
AS
result_set types.ref_cursor;
alarm ofalarmmessages.ALARMID% TYPE;
username ofalarmmessages.USERNAME% TYPE;
alarmmsg ofalarmmessages.ALARMMESSAGE% TYPE;
dvice ofalarmmessages.DEVICEID% TYPE;
begin
OPEN result_set FOR
SELECT USERNAME,ALARMID,ALARMMESSAGE,DEVICEID
FROM ofalarmmessages where newoldflag='N';
LOOP
FETCH result_set into username,alarm,alarmmsg,dvice;
update ofalarmmessages set newoldflag ='Y' where alarmid= alarm;
END LOOP;
RETURN result_set;
CLOSE result_set;
END;
/
show errors;
【问题讨论】:
-
是的,如果您尝试在 SELECT 语句中调用此函数,则会收到该错误。你有什么问题?
-
如何从同一个函数中获取结果集以及更新操作。
-
无论如何,这里的代码确实存在一些问题。 LOOP 将如何终止?你为什么要返回一个已经用尽的游标?你觉得 CLOSE 在 RETURN 之后会如何执行?
-
或者请告诉我如何使用 var rc refcursor exec :rc := func;在我的程序中。
-
请不要在函数内部进行更新操作,除非绝对必要,即你必须返回一些东西。否则它会很脏,并导致您遇到错误。使用程序更新;然后很清楚发生了什么。
标签: sql oracle stored-procedures plsql dml