Avatar billede mundt Nybegynder
19. september 2001 - 14:34 Der er 15 kommentarer og
2 løsninger

Autonummerering i Oracle

Hvordan laver man autonummerering i tabeller i Oracle på samme måde som det gøres i Microsoft Access 97.

René
Avatar billede ehf Nybegynder
19. september 2001 - 14:40 #1
I oracle laver du autonummering ved at trække et nummer fra en sekvens.

create sequence minsekvens;

select minsekvens.nextval from dual;
Avatar billede nosjns Nybegynder
19. september 2001 - 14:41 #2
Du opretter en sequence.

F.eks:

create sequence test_seq start with 1;

Derefter mener jeg du i din insert-statement kan bruge bruge følgende:

INSERT (nr, test) VALUES (test_seq.nextval, \'linie 1);

Ellers kan du hente værdien på følgende måde:

SELECT test_seq.nextval FROM DUAL;

Du kan bruge curval istedet for nextval for at hente den nuværende værdi.

Håber det hjælper.
Avatar billede mundt Nybegynder
19. september 2001 - 15:13 #3
Det har jeg gjort.

For at få tilføjet nummeret til min tabel har jeg lavet en trigger hvori jeg bruger \'new\' og \'old\'. Men jeg får af vide at jeg ikke kan anvende disse kommandoer i table level triggers (Fejl ORA-04082).
Dvs. jeg får ikke lov til indsætte mit nye nummer i min tabel genereret af min Seqence.

René
Avatar billede ehf Nybegynder
19. september 2001 - 15:21 #4
New og old kan du kun bruge på row level triggers.

Hvordan havde du tænkt dig at bruge en sekvens værdi på en table level trigger??

Værdien skal vel ind i en eller anden kolonne i en eller anden række. I en table level
trigger har du jo ikke fat i en række.
Avatar billede nosjns Nybegynder
19. september 2001 - 15:22 #5
Dette skulle virke:

CREATE OR REPLACE TRIGGER cd_ins_bef
  BEFORE INSERT ON cd_arkiv
  REFERENCING NEW AS new_row
  FOR EACH ROW
DECLARE
  -- local variables here
BEGIN
  SELECT cd_nr.nextval INTO :new_row.cd_nr FROM dual;
END cd_ins_bef;
Avatar billede mundt Nybegynder
19. september 2001 - 15:42 #6
Er dit cd_nr ikke en \'Sequence\'?

Jeg har brug for at få insat den nygenererede værdi fra min \'Sequence\' til min table.

René
Avatar billede nosjns Nybegynder
19. september 2001 - 15:45 #7
Jeg kaldte dem det samme...
Her er en rette version.

CREATE OR REPLACE TRIGGER cd_ins_bef
  BEFORE INSERT ON cd_arkiv
  REFERENCING NEW AS new_row
  FOR EACH ROW
DECLARE
  -- local variables here
BEGIN
  SELECT cd_seq.nextval INTO :new_row.cd_nr FROM dual;
END cd_ins_bef;
Avatar billede nosjns Nybegynder
19. september 2001 - 15:46 #8
cd_seq er mit sequence navn.
Avatar billede mundt Nybegynder
19. september 2001 - 15:55 #9
Jeg får stadig ikke lov til at anvende NEW (fejl = ORA-04082: NEW or OLD references not allowed in table level triggers).

Er det fordi Oracle ikke er sat ordentligt op så jeg kan anvende NEW og OLD eller mangler jeg noget i min kode?

René
Avatar billede nosjns Nybegynder
19. september 2001 - 15:58 #10
Kan du ikke lige vise din trigger definition. Jeg har testet det på en 8.1.6 database, hvor det virker.
Avatar billede ehf Nybegynder
19. september 2001 - 16:02 #11
Din trigger skal fyre som en row level trigger.

Nosjns har beskrevet en create or replace trigger
i denne står der også FOR EACH ROW.
DVS den fyrer for hver række som bliver indsat. Hvis der ikke stod FOR EACH ROW
bliver triggeren fyret en gang for hvert insert statement (som kan indsætte flere rækker).

Når der er tale om en \"statement trigger\", kan du ikke anvende new eller old.
Disse bruges på kolonne niveau.
Avatar billede mundt Nybegynder
19. september 2001 - 16:03 #12
Jeg kører på en 8.0.6 database og min trigger ser ud som nedenstående:

CREATE OR REPLACE TRIGGER TRG_CNT_OTBLMUNDT
Before INSERT OR UPDATE on OTBLMUNDT
REFERENCING NEW AS new_row
DECLARE

BEGIN
      SELECT MUNDT.NEXTVAL into :new_row.pk_mundt FROM dual;

END;

/


René
Avatar billede nosjns Nybegynder
19. september 2001 - 16:05 #13
Det skal kun være på \'Before Insert\', dvs:

Before INSERT on OTBLMUNDT

Jeg ved ikke om det hjælper - PRØV DET :-)
Avatar billede mundt Nybegynder
19. september 2001 - 16:07 #14
Det gør det ikke. Kan det være noget opsætningsmæssigts som gør at jeg ikke kan få fat i NEW og OLD?

René
Avatar billede ehf Nybegynder
19. september 2001 - 16:10 #15
CREATE OR REPLACE TRIGGER TRG_CNT_OTBLMUNDT
Before INSERT OR UPDATE on OTBLMUNDT

FOR EACH ROW -- Hvis denne ikke er der har du ikke fat i en række, men et statement
                    -- Som ORA-04082 skriver kan du ikke bruge NEW på en table level trigger.
                    -- Den har jo en kolonne at putte værdien i.
REFERENCING NEW AS new_row
DECLARE
    BEGIN
        SELECT MUNDT.NEXTVAL into :new_row.pk_mundt FROM dual;
END;
Avatar billede nosjns Nybegynder
19. september 2001 - 16:10 #16
Følgende burde virke (se ehf\'s svar):

CREATE OR REPLACE TRIGGER TRG_CNT_OTBLMUNDT
  BEFORE INSERT ON cd_arkiv
  REFERENCING NEW AS new_row
  FOR EACH ROW
BEGIN
  SELECT MUNDT.NEXTVAL into :new_row.pk_mundt FROM dual;
END TRG_CNT_OTBLMUNDT;
Avatar billede mundt Nybegynder
19. september 2001 - 16:14 #17
Mange tak for hjælpen - det var For Each der gjorde det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester