Oracle
 sql >> Baza danych >  >> RDS >> Oracle

SPRAWDŹ ograniczenie daty urodzenia?

Sprawdź ograniczenia muszą być deterministyczne. Oznacza to, że określony wiersz musi zawsze spełniać ograniczenie lub zawsze musi nie spełniać ograniczenia. Ale SYSDATE jest z natury niedeterministyczny, ponieważ zwracana wartość stale się zmienia. Dlatego nie możesz zdefiniować CHECK ograniczenie, które wywołuje SYSDATE lub dowolna inna funkcja zdefiniowana przez użytkownika.

Jeśli spróbujesz odwołać się do SYSDATE w definicji ograniczenia otrzymasz błąd

SQL> ed
Wrote file afiedt.buf

  1  create table t(
  2      birth_date date check( birth_date between date '1900-01-01' and
  3                                                sysdate )
  4* )
SQL> /
                                              sysdate )
                                              *
ERROR at line 3:
ORA-02436: date or system variable wrongly specified in CHECK constraint

Możesz utworzyć CHECK ograniczenie, w którym zarówno minimalna, jak i maksymalna data były zakodowane na stałe, ale nie byłoby to szczególnie praktyczne, ponieważ musiałbyś stale usuwać i odtwarzać ograniczenie.

SQL> ed
Wrote file afiedt.buf

  1   create table t(
  2       birth_date date check( birth_date between date '1900-01-01' and
  3                                                 date '2011-12-08' )
  4*  )
SQL> /

Table created.

Praktycznym sposobem wymuszenia tego rodzaju wymogu byłoby utworzenie wyzwalacza na stole

CREATE OR REPLACE TRIGGER check_birth_date
  BEFORE INSERT OR UPDATE ON employee
  FOR EACH ROW
BEGIN
  IF( :new.emp_dob < date '1900-01-01' or 
      :new.emp_dob > sysdate )
  THEN
    RAISE_APPLICATION_ERROR( 
      -20001, 
      'EMployee date of birth must be later than Jan 1, 1900 and earlier than today' );
  END IF;
END;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uciekanie znaków kontrolnych w Oracle XDB

  2. podzapytanie skalarne w instrukcji if Warunek w PL/SQL

  3. Oracle:czy kolejność kolumn ma znaczenie w indeksie?

  4. Dane wyjściowe skryptu SQL Developer obcinają szerokość sys_refcursor

  5. Jak utrwalać DUŻE BLOBy (>100 MB) w Oracle przy użyciu Hibernate