Oracle - есть ли способ обойти SELECT INTO в блоке PL/SQL
Я пытаюсь создать триггер, который автоматически обновляет состояние приложения учащегося при изменении строки состояния приложения в таблице приложения. Я просматриваю Интернет чуть более часа или около того, и, несмотря на то, что нашел потенциальный способ обойти использование EXECUTE IMMEDIATE
Я не могу достичь желаемого результата (EXECUTE IMMEDIATE
вызывал ошибку несвязанной переменной).
Триггерный код
CREATE OR REPLACE TRIGGER trg_applications
BEFORE INSERT OR UPDATE ON applications FOR EACH ROW
BEGIN
IF UPDATING THEN
/* If the status is ACCEPTED, then approve the students application */
SELECT CASE
WHEN get_status(:NEW.status_id) =
LOWER('Applicant Accepted Offer')
THEN student_accept_offer( :NEW.student_id )
END
FROM status;
END IF;
END;
Метод get status возвращает VARCHAR2
чтобы проверить, соответствует ли новый статус условию, если да, я хочу обновить student_approved
строка с помощью autonomous_transaction
ниже.
student_accept_offer
код
CREATE OR REPLACE FUNCTION student_accept_offer( this_stu_id NUMBER )
RETURN VARCHAR2 IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
UPDATE students
SET students.student_on_placement = 1
WHERE students.student_id = this_stu_id;
COMMIT;
RETURN 'Student has approved application';
END student_accept_offer;
Эта функция работает должным образом, когда я тестирую ее вне триггера, однако, когда она встроена в триггер, PLS-00428
ошибка брошена. Может ли кто-нибудь указать мне правильное направление относительно того, как я могу обойти это, чтобы я мог автоматически запускать эту функцию при обновлении, если статус соответствует.
Спасибо за ваше время
РЕДАКТИРОВАТЬ - таблицы, на которые я ссылаюсь
1 ответ
Немного изменив код, чтобы удалить SELECT
заявление (как это кажется ненужным), тогда это работает?
CREATE OR REPLACE TRIGGER trg_applications
BEFORE INSERT OR UPDATE ON applications FOR EACH ROW
BEGIN
IF UPDATING THEN
/* If the status is ACCEPTED, then approve the students application */
IF get_status(:NEW.status_id) = 'applicant accepted offer' THEN
student_accept_offer( :NEW.student_id );
END IF;
END IF;
END;