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;
Другие вопросы по тегам