Oracle-CASE语句中的嵌入式UPDATE方法



我写了一个case语句,它获取用户创建的应用程序的当前状态;每当用户应用程序状态发生更改时,此语句就会在触发器中触发。当他们的状态变为"已接受"时,我希望我的学生表中有一行更新,以表明他们正在接受安置。

我知道这个方法在以前的版本中通过返回1和0进行测试时是有效的,但由于合并了UPDATE方法,我的触发器一直失败,我该如何在我的case语句中合并UPDATE调用?

案例说明代码:

SELECT DISTINCT CASE 
   WHEN get_status(:NEW.status_id) = LOWER('Applicant Accepted Offer')
THEN
UPDATE students 
   SET students.student_on_placement = 1 
   WHERE applications.student_id = :OLD.student_id;   
END AS status_result 
FROM status;

get_status方法(也要避免有关我的方法的问题)

CREATE OR REPLACE FUNCTION get_status( this_id NUMBER ) 
RETURN VARCHAR2 
AS this_type status.status_type%TYPE;
BEGIN
   SELECT status_type
      INTO this_type
   FROM status
   WHERE status_id = this_id;
   RETURN LOWER(this_type);
END get_status;

不可能在SELECT查询中执行DML操作,否则,您将得到ORA-14551错误:

ORA-14551:无法在查询内执行DML操作

原因:DML操作,如插入、更新、删除或选择更新,无法在查询内部或PDML从属服务器下执行。

操作:确保不执行有问题的DML操作,或者使用自主事务在查询或PDML从机中执行DML操作。

http://ora-14551.ora-code.com/

因此,DML和查询必须分开,或者更新语句必须放入在自主事务中执行的函数中。请在此处查看此Oracle文档:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/autonotransaction_pragma.htm

最新更新