【问题标题】:Oracle - Embedded UPDATE method in CASE statementOracle - CASE 语句中的嵌入式更新方法
【发布时间】:2013-12-15 18:16:32
【问题描述】:

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

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    不能在 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

    【讨论】:

    • 谢谢 Reza,我会想办法解决这个问题。
    • 另外,类似的问题:stackoverflow.com/questions/8729236/…
    • 我想我会尝试创建一个变量,然后在 CASE 语句中将其设置为 1 或 0,然后根据其值执行 DML 操作,谢谢您的帮助:)
    猜你喜欢
    • 2017-03-13
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多