2

私が尋ねている質問がすでに他の場所で回答されている場合は、事前に謝罪しますが、適切な回答を見つけるのに苦労しました。1つのテーブルに基づいて単純なトリガーを作成する方法を知っていますが、2つのテーブル間でリンクの更新を実現しようとしています。シナリオは次のとおりです。コーステーブルには期間列があり、オファリングテーブルにはstart_date列があります。オファリングは、コースが提供され、2つのテーブル(コースとオファリング)がcourse_idによってリンクされているインスタンスです。対応するコースの期間が5日の場合、オファリングテーブルの開始日が1月になるのを防ぐトリガーを作成する必要があります。私はこのトリガーを作成しようとしましたが、自分の努力を投稿することができますが、私は絶対に確信しています。

CREATE OR REPLACE TRIGGER check_duration
  BEFORE UPDATE on offering
  FOR EACH ROW
BEGIN
  SELECT c.duration
  INTO duration
  FROM course c
  WHERE c.duration = 5
IF(:new.start_date BETWEEN to_date('01/01/2013', 'DD/MM/YYY') AND to_date('31/01/2013', 'DD/MM/YYY')
  THEN RAISE_APPLICATION_ERROR(20100, 'Cannot run particular course during this month')
END IF;
END;

コーステーブル:

Course_id(pk) | Title | Duration | Cost

オファリングテーブル:

offering_id(pk) | start_date | location | instructor | course_id(fk)

他にも2つのテーブル出席と学生があります。この質問のためにこれらのテーブルの構成を投稿する必要はないと思います。

4

1 に答える 1

0

テーブルに関する新しい情報がある場合は、これを微調整する必要があるかもしれませんが、テーブルにコースID列があるというコメントに基づいた最初のスタブは次のofferingとおりです。

CREATE OR REPLACE TRIGGER check_duration
  BEFORE UPDATE on offering
  FOR EACH ROW
DECLARE
  isFound NUMBER;
BEGIN
  -- Just want to know if there's a duration 5 record for the course...
  SELECT 1 INTO isFound FROM DUAL WHERE EXISTS (
    SELECT * FROM course c
    WHERE c.course_id = :NEW.course_id AND c.duration = 5);
  -- Fallthrough to here means a course was found with duration 5. Is
  -- it scheduled for January (month #1) of any year?
  IF EXTRACT(MONTH FROM :NEW.start_date) = 1 THEN
    THEN RAISE_APPLICATION_ERROR(20100, 'Cannot run particular course during this month');
  END IF;
EXCEPTION
  -- If the query didn't find a course with duration 5 it throws
  -- a NO_DATA_FOUND exception. Ignore the exception because not
  -- finding a course means it's OK to add the row.
  WHEN NO_DATA_FOUND THEN
    NULL;
END;
于 2013-03-26T18:35:43.590 に答える