学校の割り当て、データベースの作成に取り組んでいます。私のデータベースは写真ビジネスをモデル化しています。そのほとんどはシンプルですが、今は私が立ち往生しています。私のモデルでは、私はPhotography_Availability Entity(Ph_Av)を持っています。そして、写真家が予定されているか利用できないときはいつでも、写真家が利用できない日付と時間間隔(Available_Date、Start_Time_Available、Fin_Time_Available)これらはすべて私のOracleモデラー内のDateTimeデータ型です。誰かが撮影者をスケジュールしようとするたびに、使用可能かどうかをチェックするトリガーを実装したいと考えています(適切な日付と時間間隔で)。ここに私のコードは次のとおりです。私が欲しいの基本的なロジックは、カメラマンはすでに3から午後5時までの間にスケジュールされていて、誰かが2と午後4時の間で、同じ写真家のスケジュールを設定しようと言う、ということであるOracleトリガ:どのように実装するのですか?
CREATE OR REPLACE TRIGGER SAFE_SCHEDULE
BEFORE INSERT OR UPDATE ON PH_AV
FOR EACH ROW
DECLARE
ID VARCHAR(20) := NULL;
AV_DATE DATE := NULL;
START_TIME DATE := NULL;
FIN_TIME DATE := NULL;
BEGIN
SELECT PHOTOGRAPHER_ID INTO ID FROM PH_AV WHERE PHOTOGRAPHER_ID = :NEW.PHOTOGRAPHER_ID ;
SELECT AVAILABILITY_DATE INTO AV_DATE FROM PH_AV WHERE PHOTOGRAPHER_ID = :NEW.PHOTOGRAPHER_ID;
SELECT START_TIME_AVAIL INTO START_TIME FROM PH_AV WHERE PHOTOGRAPHER_ID = :NEW.PHOTOGRAPHER_ID;
SELECT FIN_TIME_AVAIL INTO FIN_TIME FROM PH_AV WHERE PHOTOGRAPHER_ID = :NEW.PHOTOGRAPHER_ID;
IF ((:NEW.START_TIME_AVAIL >= START_TIME AND :NEW.START_TIME_AVAIL <= FIN_TIME)
OR (:NEW.FIN_TIME_AVAIL >= START_TIME AND :NEW.FIN_TIME_AVAIL <= FIN_TIME)
OR (:NEW.START_TIME_AVAIL <= START_TIME AND :NEW.FIN_TIME_AVAIL >= FIN_TIME))
THEN
DBMS_OUTPUT.PUT_LINE('Cannot be scheduled, photographer unavailable');
ELSE
DBMS_OUTPUT.PUT_LINE('PHOTOGRAPHER SUCCESSFULLY SCHEDULED');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO DATA FOUND');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR-' || SQLERRM);
END;
/
、明らかにこれは衝突します。 Myのifステートメントは、新しい挿入された値が予定されている値と衝突するかどうかをチェックします。今、私がこれを実行した後、Script Outputはエラーがあると述べません。しかし、私のメッセージログにはかなりの数のクレームがあります(そのほとんどは(内部エラー)No Throwable Stack Elementでnullです)。
これは私の初めてのトリガを実装したもので、宣言された変数のDateデータ型と思われるかもしれませんが、私は迷っています。助言がありますか?エントリ内の重複を防ぐために、次のと要件として、私は次のようなものだろう、簡単な構造で
あなたのタイトルを編集しました:SQLは "続編"とは言えませんが、もっと重要なことに、トリガーはSQL \ * Plusとほとんど関係ありません。質問はOracleトリガーに関するものです。 – mathguy
無関係ですが、同じテーブルから4つの異なる列を読み取るのに4つの選択肢は必要ありません。あなたのケースでは、何も選択する必要はありません。 ':PHOTOGRAPHER_ID =:NEW.PHOTOGRAPHER_ID'を使って、あなたが望む情報を既に含んでいるだけです。 –
「PH_AVを記述する」を追加することをお勧めします。列の種類を参照してください。エラー出力のログが表示されていることを示すのに役立ちます。 – slashlos