Как сравнить текущую дату с предыдущей датой, используя триггеры в форме оракула?

Я новичок в формах и триггерах оракула, и я делаю форму налогоплательщика, в которой я сделал следующие поля:

Tax_Code| From_Date | To_Date

Теперь я хочу сделать триггер, который должен проверять, что дата, которая вводится сейчас, не находится между датой, которая была введена ранее.

например, если есть запись

001 | 01-JUL-2013 | 30-JUN-2014 

тогда никто не сможет написать какую-либо дату между этими ранее введенными датами.


person Xan    schedule 12.08.2013    source источник
comment
Могу ли я ввести 002 | 01-JUL-2014 | 31-DEC-2014 или 003 | 01-JAN-2013 | 30-JUN-2013? А как же 004 | 01-JAN-2013 | 31-DEC-2013?   -  person Rachcha    schedule 12.08.2013
comment
вы можете ввести 002 и 003, но 004 недопустимо, потому что 30-DEC-2013 находится между этими датами, которые были введены ранее.   -  person Xan    schedule 12.08.2013


Ответы (1)


Вам нужно будет объединить пару разных триггеров, чтобы сделать это...

  1. Внутри триггера POST-RECORD вам нужно будет добавить вызов встроенной функции «post», чтобы отправить новую/обновленную запись в базу данных.

  2. Создайте триггер WHEN-VALIDATE-RECORD, который будет запрашивать базу данных примерно так:

    declare
      cursor date_check_cur is
        select tax_code, start_date, end_date
        from   tax_code_table t
        where  :block.start_date between t.start_date and t.end_date
          or   :block.end_date   between t.start_date and t.end date;
      v_dates date_check_cur%rowtype;
    begin
      open date_check_cur;
      fetch date_check_cur into v_dates;
      if date_check_cur%found then
          null; -- Display some kind of error to the user that entered dates conflict with returned date range...
      end if;
      close date_check_cur;
    end;
    

Предостережение к этому решению заключается в том, что теперь вам нужно быть ОЧЕНЬ осторожным с состоянием транзакции, поскольку вы записали (но не зафиксировали) данные в базу данных. Это решение также не учитывает возможность ввода дат двумя пользователями с двух разных экранов. Для этого потребуются гораздо более сложные триггеры уровня базы данных...

В качестве альтернативы вы можете выполнить принудительное выполнение (используя тот же запрос, указанный выше) в триггерах PRE-INSERT и PRE-UPDATE, которые не будут срабатывать до тех пор, пока записи не будут отправлены в базу данных, но это открывает риск ввода множества неработающих данные, которые должны быть исправлены построчно....

person Starfighter    schedule 01.10.2013