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

时间:2013-11-29 14:10:38

标签: sql oracle

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

1 个答案:

答案 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