我写了一个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