Oracle Trigger für Datumgsprüfung

nautiLus`

Erfahrenes Mitglied
Hi, ich möchte in einem Trigger unter Oracle prüfen ob ein Wert aus einem INSERT-Statement dem Ausdruck 'hh:mm:ss' entspricht, wobei 'hh' von 0-23, 'mm' von 0-59 und 'ss' von 0-59 geht. Mach ich das am besten mit substring oder mittels einen regulären Ausdruck? Bei letzterem bräuchte ich etwas Hilfe,

mfg nauti
 
Hallo, danke mal für den Link!

ich habe versucht mal Datensätze abzufragen aus einer Tabelle mittels

Code:
SELECT s FROM X_table WHERE REGEXP_LIKE(s, '[[:digit:]]{2}\:[[:digit:]]{2}\:[[:digit:]]{2}');

In der Datenbank befindet sich folgendes:

S
--------
23:01:10
24:01:10
23d01s10
23:21:23


Selektiert wird dann durch obiges Query:

S
--------
23:01:10
24:01:10
23:21:23

Jetzt die Frage: wie bekomme ich jetzt noch den 2. Datensatz weg, welcher als hh 24 besitzt? Auf der Website hab ich nichts genaueres darüber finden können.

Danke im Voraus.

mfg nauti

oh, ok erledigt:

SELECT s FROM X_table WHERE REGEXP_LIKE(s, '^[[0-2][0-3]\:[0-5][0-9]\:[0-5][0-9]$');
 
Zuletzt bearbeitet:
Hallo!

Über einen Regex ist das IMHO doch etwas schwieriger hinzubekommen...
Schau mal hier:
Code:
   SQL> select * from datevalues;
   
   DATEVALUE
   --------------------------------
   23:01:10
   24:01:10
   23d01s10
   23:21:23
   
   SQL> create or replace function isDateValid(dateValue In varchar,dateFormat In varchar)
     2  Return number Is
     3  convertedDate date;
     4  begin
     5	 convertedDate:=to_date(dateValue,dateFormat);
     6	 return 1;
     7  exception
     8	 when others then return NULL;
     9
    10  end;
    11  /
   
   Function created.
   
   SQL>
   SQL> show errors;
   No errors.
   SQL> select datevalue from datevalues where isdatevalid(datevalue,'HH24:MI:SS') = 1;
   
   DATEVALUE
   --------------------------------
   23:01:10
   23:21:23
   
   SQL>

... wenn man unter Oracle bei den Check Constraints auch Benutzer definierte Funktionen aufrüfen könnte bräuchtest du auch keinen trigger mehr... aber da dies nicht geht...
http://www.lc.leidenuniv.nl/awcourse/oracle/appdev.920/a96590/adg05itg.htm
Restrictions on CHECK Constraints
...
The condition cannot contain a user-defined SQL function.

SELECT s FROM X_table WHERE REGEXP_LIKE(s, '^[[0-2][0-3]\:[0-5][0-9]\:[0-5][0-9]$')
Ich glaub das ist nicht ganz korrekt... was ist denn mit 19:44:52, ist das keine korrekte Uhrzeit?

... aber ich bin mir sicher, unser Oracle Spezialist Exceptionfault hat dazu noch ne viel elegantere Lösung im petto ;-)

Gruss Tom
 
hi, danke mal für die lösung.

eine weitere art das zu machen wäre auch:

Code:
CREATE OR REPLACE TRIGGER insert_x_null_date
BEFORE UPDATE OF s ON x_table
FOR EACH ROW
DECLARE
    t timestamp;
BEGIN
    SELECT TO_TIMESTAMP ('10-10-02 ' || :NEW.s, 'DD-MM-RR HH24:MI:SS') INTO t FROM dual;
END;
/

(Stammt nicht von mir)

nauti
 
Zurück