0

Oracle/PLSQL でプロセスを作成する必要があります。作成する新しい行の start_date と end_date の間の時間間隔が、他の行の他の start_dates と end_dates と交差してはならないことを確認する必要があります。

次に、各行でその条件を確認する必要があります。一致しない場合は、繰り返しの指示を停止し、その後、「与えられた時間間隔が正しくありません」などのメッセージを表示する必要があります。

Oracle/PLSQL で繰り返し命令を作成する方法がわかりません。助けていただければ幸いです。

date_hour_i と date_hour_e で指定された時間間隔が、残りの行で指定された他の時間間隔と交差しないことをテーブルの各行で確認するには、そのようなループまたはスマートが必要です。もう1つの仕様....各行の日付は、クライアントと、指定された時間間隔でクライアントにヘアカットを実行する従業員に対応します....そして、新しい行を導入しないようにしたい同じクライアント(または他のクライアント)と従業員、新しい時間間隔は、同じ/他のクライアントと従業員との他の時間間隔と交差します....私が自分自身を明確にしたことを願っています...

4

4 に答える 4

1

あなたの読書の楽しみのための 2 つのリンク:-

重複のない時間間隔

重複値を回避しています...

于 2010-05-25T06:53:32.857 に答える
0

なぜ各行をチェックするのですか?開始時刻と終了時刻を照会するだけです。結果が0より大きい場合はエラーメッセージを出力し、そうでない場合は挿入します。

于 2010-05-24T19:51:26.787 に答える
0

これは、BEFORE INSERTORUPDATEトリガーの間に発生すると思います。

日付の重複について既存のテーブルをクエリする必要がありますが、これにより、変更トリガーエラーが発生します。

これを回避するには、PRAGMAAUTONOMOUS_TRANSACTIONを使用して新しいスレッドを生成します。

または、各日付範囲をセカンダリテーブルに保存し、それを使用して各挿入に対してクエリを実行することもできます...次のようになります(コンパイルされていません)

CREATE OR REPLACE TRIGGER mytrigger
BEFORE INSERT OR UPDATE ON mytable FOR EACH ROW
DECLARE 
    cnt number;
BEGIN 
    SELECT count(*) into cnt
    FROM reserved_date_range                
    WHERE :new.begin_date BETWEEN begin_dt and end_dt

    if ( cnt > 0 ) then
        raise_application_error(-20000,'Overlapping date ranges');
    else
        insert into reserved_date_range( begin_dt, end_dt ) 
        values ( :new.begin_date, :new.end_date );
    end if;
End;
/
于 2010-05-24T19:54:12.617 に答える
0

テーブルがtab1で、開始日がstdateで終了日がendateであるとします。また、新しい開始日と新しい終了日をPLSQL変数v_stdateとv_endateに入れます。

あなたの挿入は次のようになります

insert into tab1 (stdate,endate)
select v_stdate,v_endate  from dual
where not exists(
select 'overlap' from tab1 t1
where v_stdate between(t1.stdate and nvl(t1.endate,v_endate) 
or   v_endate between(t1.stdate and nvl(t1.endate,v_endate)

)

この問題の解決策は、並行性の問題のために少し複雑です。あなたの場合、イベント(またはリソース)をスケジュールしています。したがって、リソース(クライアントなど)を保持するテーブルがあると思います。クライアントに別のスケジュール (またはイベント) を追加する前に、特定のクライアント レコードを次のようにロックする必要があります。

select client_id from Clients where client_id=p_client_id for update;

次に、オーバーラップがないことを確認し、新しいスケジュールを挿入してコミットします。この時点で、ロックが解除されます。シリアル化オブジェクトを使用しないソリューションは、同時実行性の問題により、必ず欠陥があります。 PLSQL または After Insert トリガー内。ただし、実際のリソース レコードをロックすることは絶対に必要です。

于 2010-05-24T20:09:24.873 に答える