Announcement

Collapse
No announcement yet.

months_between(): Fehlermeldung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • months_between(): Fehlermeldung

    Hallo zusammen,

    ich bin grad im 4.Semester Informatik und wir nehmen gerade SQL durch.
    Leider scheitere ich schon bei einer ganz einfachen Aufgabe :-(

    Also ich habe eine Tablle mit Personendaten:

    insert into pers values (406, 'Coy', 1950, to_date('10-03-1986','DD-MM-YYYY'), 60000, 'Kaufmann', 'K55', 123);

    Das vierte Attribut wird unter dem Tabellennamen eindatum für Einstelldatum gespeichert.

    Nun möchte ich noch das Constraint hinzufügen: "Alle Personen die länger als 20 Jahre gearbeitet haben, dürfen nicht weniger als 30000 verdienen".

    alter table pers
    add constraint mingehalt_20_pers
    check ( not ((months_between(sysdate, eindatum) >= 240) and (gehalt < 30000)) );


    Leider klappt der Vergleich der zwei Datumsangaben nicht.

    Hilft mir hier jemand weiter?

    Gruß Alwin

  • #2
    Servus Alwin,

    ich hab bis dato noch nie gelesen, daß so ein Constraint mit ORCL funktioniert!

    Ich würde einen Trigger vorschlagen.

    CREATE OR REPLACE TRIGGER tr_pers_mon
    BEFORE INSERT
    ON pers
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
    IF not ((months_between(sysdate, new:eindatum) >= 240) and (new:gehalt < 30000)) )
    RAISE_APPLICATION_ERROR(-20000, 'Mind. Gehalt', TRUE);
    END IF;
    END;


    lg Dietmar

    Comment


    • #3
      Hallo,

      @Dietmar: Also Check-Constraints gibt es schon bei ORACLE

      @Alwin: Dein Constraint wird sich so nicht anlegen lassen. Ich bekomme beim Test einen "ORA-02436: Falsche Benutzung von Datums- oder Systemvariablen in CHECK-Regel"
      Wenn ich die Beschreibung zur Fehlermeldung richtig interpretiere kannst du keinen Check-Constraint unter Verwendung von Datumsfunktionen oder Systemvariablen anlegen, wenn dadurch ein veränderliches, nicht eindeutiges Ergebnis erzielt wird.
      Ist auch irgendwie logisch, denn wie soll Oracle den Constraint sicherstellen, wenn zum Zeitpunkt des Einfügens der Check zwar TRUE ist, aber zwei Tage später FALSE wäre?
      Ein INSERT-Trigger, wie von Dietmar vorgeschlagen, ist hier der einzig gangbare (und sinnvolle) Weg diese Business-Rule in der Datenbank zu verankern.

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Originally posted by Falk Prüfer View Post
        Ein INSERT-Trigger, wie von Dietmar vorgeschlagen, ist hier der einzig gangbare (und sinnvolle) Weg diese Business-Rule in der Datenbank zu verankern.

        Gruß Falk
        - Dann merkt aber keiner, wenn jemand die Grenze von 20 Dienstjahren überschreitet und weniger als die 30000 verdient, und schon in der DB vorhanden ist

        Comment


        • #5
          Originally posted by Ulrich Vaid View Post
          - Dann merkt aber keiner, wenn jemand die Grenze von 20 Dienstjahren überschreitet und weniger als die 30000 verdient, und schon in der DB vorhanden ist
          Das ist ja richtig, aber wie willst du solch eine veränderliche Größe in Form eines Constraints realisieren und vor allem was sollte die DB in diesem Fall tun, den laufenden Betrieb einstellen, den User informieren (tja welchen ?) ? Da das Einstellungsdatum ohne Zeitanteil gespeichert ist werden alle Betroffenen ihre 20 Dienstjahre Nachts um 0:00 Uhr absolviert haben - eine schlechte Zeit
          Das Sicherstellen der Business-Rule beim Einfügen sollte hier ausreichen - für alle weitergehenden Prüfungen sind andere Tools (Berichte, Jobs, Alerts) zuständig.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Originally posted by Falk Prüfer View Post
            ...den laufenden Betrieb einstellen,
            Gruß Falk
            -- Das wäre mal was anderes :-)

            Nein, ich gebe dir vollständig recht, ich wollte nur den Original Poster auf das Problem hinweisen, das, wenn er dies mittels Trigger oder auch Constraint implementiert, darauf achten muss


            Gruss

            Comment


            • #7
              Hallo zusammen!

              Vielen Dank für die umfangreiche Antworten. Ich glaube ihr habt Recht, die
              Aufgabe ist nur mit Trigger zu lösen. Das muss ich mir noch näher anschauen und dann werd ich es ausprobieren.
              Frag morgen noch mal unseren Professor, warum er das Beispiel denn schon so früh gebracht hat.

              Gruß Alwin

              Comment


              • #8
                Datenmodell

                Hallo Alwin,
                Zuletzt editiert von SiegfriedEhlert; 11.05.2007, 03:32.

                Comment

                Working...
                X