我写了一个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;
答案 0 :(得分:2)
无法在 SELECT 查询中执行 DML 操作,否则会出现 ORA-14551 错误:
ORA-14551:无法在查询中执行DML操作
原因:无法在查询内或PDML从站下执行插入,更新,删除或select-for-update等DML操作。
操作:确保未执行有问题的DML操作或使用自治事务在查询或PDML从属中执行DML操作。
http://ora-14551.ora-code.com/
因此,必须将DML和查询分开,或者必须将update语句放入在自治事务中执行的函数中。请在此处查看此Oracle文档:
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/autonotransaction_pragma.htm