Announcement

Collapse
No announcement yet.

wie erzeuge ich einen "Autowert"???

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

  • wie erzeuge ich einen "Autowert"???

    folgendes Anfängerproblem:

    ich möchte in einer Tabelle ein ID-Feld haben, das automatisch hochgezählt wird. Bei SQL-Server war das vom Typ Autowert. Wie mache ich das nun in Oracle??? Bin schon echt verzweifelt... das kann doch nicht so schwer sein.

    Danke im voraus

  • #2
    hallo,
    geht bei oracle über die sequenzen (create sequence) und beim insert oder trigger mit sequence.nextval übernehmen.

    :-) thoma

    Comment


    • #3
      Hi!

      Also du benötigst für solche Autoincrement-Felder immer
      einen Trigger + eine Sequence.

      Beispiel (kannst für deine Zwecke gebrauchen nur Tabell etc umbenennen ) aus der Praxis :

      -- Start of DDL script for S_MELDEDATUM_BOSCH
      -- Generated 23-Jul-02 3:37:21 pm

      -- Sequence S_MELDEDATUM_BOSCH
      -- Please Note: The 'Start With' value is taken directly
      -- from the 'Last Value' field

      CREATE SEQUENCE s_meldedatum_bosch
      INCREMENT BY 1
      START WITH 1074
      MINVALUE 1
      MAXVALUE 999999999999999999999999999
      NOCYCLE
      ORDER
      CACHE 20
      /

      -- End of DDL script for S_MELDEDATUM_BOSCH

      -- Trigger T_MELDEDATUM_BOSCH

      CREATE OR REPLACE TRIGGER t_meldedatum_bosch
      BEFORE INSERT
      ON meldedatum_bosch
      REFERENCING NEW AS NEW OLD AS OLD
      FOR EACH ROW
      BEGIN
      SELECT S_MELDEDATUM_BOSCH.NEXTVAL INTO :NEW.nr FROM DUAL ;
      END;
      /

      Natürlihc zuerst die Tabelle dann Squence erstellen bevor es an den
      Trigger geht. Das Attribut NR ist vom Typ NUMBER (12) glaub ich.

      Gruß
      Michae

      Comment


      • #4
        besten dank, hab es (glaube ich) verstanden und was das beste ist es scheint zu funktionieren :-

        Comment


        • #5
          hi

          ich habe diesen trigger ebenfalls erstellt, allerdings gibt es bei mir folgenden fehler:

          ORA-04098: trigger 'TMS.STU_TEST_TR' is invalid and failed re-validation

          was habe ich falsch gemacht?

          win2000/oracle8.1

          mfg

          swe

          Comment


          • #6
            Hi,

            anscheinend kann der Trigger nach einer Änderung von referenzierten Objekten (ein ref. Feld wurde gedroppt oder die Sequence ist nicht mehr vorhanden o.ä.) von Oracle nicht automatisch neu compiliert werden.
            Am besten du läßt das Script zum anlegen des Triggers noch mal neu durchlaufen und schaust dir anschließend mit Show Errors die Fehlermeldungen an.

            Gruß Fal
            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


            • #7
              @falk

              ich habe das problem eingrenzen koennen!
              der trigger kann die sequence nicht auswerten, denn wenn ich feste werte zuweise funzt es.
              die sequence selber funzt aber auch.
              gibt es eine besondere syntax wie die seq. eingebunden wird?

              mfg

              swe

              Comment


              • #8
                Hallo Swen,

                wie sieht den dein Triggercode aus? Wenn man ein bißchen was sieht kann man am ehesten sagen wo der Fehler liegt.

                Gruß Fal
                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


                • #9
                  CREATE SEQUENCE stu_test_seq INCREMENT BY 1 START WITH 2 MINVALUE 1 MAXVALUE 999999999999999999999999999 NOCYCLE ORDER CACHE 20

                  sequenz funzt

                  CREATE OR REPLACE TRIGGER stu_test_tr BEFORE INSERT ON stu_test FOR EACH ROW BEGIN :NEW.NR := stu_test_seq.NEXTVAL; END;

                  das gibt fehlermeldung beim insert

                  folgender trigger funzt dagegen:

                  CREATE OR REPLACE TRIGGER stu_test_tr BEFORE INSERT ON stu_test
                  FOR EACH ROW
                  BEGIN
                  declare
                  i number(12);
                  begin
                  select max(nr) into i from stu_test;
                  i := i+1;
                  :NEW.NR := i;
                  end;
                  END;

                  ist zwar nicht so schön aber er geht. allerdings weiss ich nicht wie sich die geschwindigkeit bei zig-tausenden datensätzen verhält.

                  mfg

                  swe

                  Comment


                  • #10
                    Hallo Swen,

                    versuchs mal mit <pre>
                    ...
                    begin
                    SELECT stu_test_seq.NEXTVAL INTO :NEW.NR FROM DUAL;
                    end;</pre>

                    Gruß Fal
                    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


                    • #11
                      Hallo Swen,

                      wenn Deine Tabelle am Anfang leer ist, bekommst Du ein Problem, da MAX(ID) dann
                      ebenfalls NULL ist. Deshalb würde ich nach dem
                      SELECT noch einfügen

                      IF i IS NULL then
                      i:=0;
                      end if;

                      Gruß Rolan

                      Comment

                      Working...
                      X