アプリケーション テーブルのアプリケーション ステータス行が変更されたときに学生のアプリケーション状態を自動的に更新するトリガーを作成しようとしています。私は 1 時間ほど Web をブラウジングしてきましたが、潜在的な回避策を見つけたにもかかわらず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 メソッドは、新しいステータスが条件に一致するかどうかを確認するために a を返します。一致する場合は、以下を使用して行を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
エラーがスローされます。ステータスが一致した場合に更新時にこの関数を自動的に起動できるようにするために、これを回避する方法について誰かが私を正しい方向に向けることができますか?
御時間ありがとうございます
編集 - 私が参照しているテーブル