2013-11-29 4 views
0

Я написал оператор case, который получает текущий статус приложения, которое сделал пользователь; этот оператор срабатывает при срабатывании триггера при изменении статуса приложения-пользователя. Когда их статус становится «Принято», я хочу, чтобы таблица моих учеников обновляла строку, чтобы указать, что они находятся на месте.Oracle - встроенный метод UPDATE в операторе CASE

Я знаю, что метод работает, когда я тестировал его, возвращая 1 и 0 в предыдущей версии, но так как с помощью метода UPDATE мой триггер продолжает терпеть неудачу, как бы я включил вызов UPDATE в мой оператор case?

Дело код заявление:

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; 

ответ

2

Это не представляется возможным выполнить операцию DML внутри ВЫБРАТЬ запрос, или иным образом, вы получаете ORA-14551 ошибка:

ORA-14551: не может выполнить операцию DML внутри запроса

Причина: операции DML как вставки, обновления, удаления или выберите в обмен на обновление не может быть выполнена в запросе или под PDML раба.

Действие: Убедитесь, что операция DML с нарушением не выполняется или используется автономная транзакция для выполнения операции DML в запросе или ведомом PDML.

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

Таким образом, либо DML и запрос должен быть отделен ИЛИ оператор обновления должен быть помещен в функцию, которая выполняет в автономной транзакции. Пожалуйста, проверьте эту документацию Oracle здесь:

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

+0

Благодаря Реза, я буду стараться, чтобы придумать способ, чтобы работать вокруг этого. – Alex

+0

Кроме того, аналогичная проблема на SO: http://stackoverflow.com/questions/8729236/solution-to-cannot-perform-a-dml-operation-inside-a-query – RGO

+0

Я думаю, что я попытаюсь создать переменную и затем установите его в 1 или 0 в операторе CASE, затем выполните операцию DML на основе ее значения, спасибо за вашу помощь :) – Alex

Смежные вопросы