21. september 2001 - 14:07Der er
20 kommentarer og 1 løsning
Autonummerering i Oracle - Before insert
Når man med en sekvens og trigger i oracle laver autonummerering med \'Before Insert\' kan jeg se at \"Autonummeret\" først bliver opdateret når man forlader rækken. Dette er i mit tilfælde et problem da jeg fra Access opdaterer mine tabeller og har brug for \"Autonummeret så snart jeg har forladt et felt i \"Oracle rækken\". Min trigger ser således ud:
TRIGGER trgCntBatch BEFORE INSERT ON Batch FOR EACH ROW BEGIN SELECT cntBatch.NEXTVAL INTO :NEW.BatchID FROM dual; END;
Er der nogen facilitet i Oracle som gør at det er muligt at få opdateret \"Autonummeret\" så et enkelt felt forlades i rækken, eller har jeg glemt noget i min trigger?
Du kan selv udtrække nummeret fra sekvensen og indsætte det i din formular, men det kan medføre \"huller\" i databasen, hvis du fortryder indsættelser en gang imellem.
I din formular, dit script eller hvad det nu er, udtrækker du selv et nummer med selecten. Så arbejder du løs, og har jo allerede et anvendeligt nummer, som du så senere kan indsætte i tabellen (derfor IF=NULL sætning om trigger i basen).
Mit script for min trigger ser ud som nedenstående:
TRIGGER trgMundttrg BEFORE INSERT ON Mundt FOR EACH ROW BEGIN
IF :NEW.MundtID IS NULL THEN SELECT trgMundt.NEXTVAL INTO :NEW.MundtID FROM dual; END IF;
END;
I min tabel \'Mundt\' er der følgende felter
\'MundtID\' | \'Navn\'
Det jeg vil have er at \'MundtID\' skal opdateres (af triggeren) efter at have udfyldt feltet \'Navn\' og ikke først når jeg går til næste række i tabellen.
Du må på en eller anden måde have adgang til mundt tabellen. Man kan ikke skrive direkte i tabellen. Hvis du bruger en \"hjemmelavet\" formularer kan du selv udtrække et nummer og indsætte. Hvis du bruger TOAD kan du mappe en sequence til et felt. Hvis du har en Access formular, må du via VB kunne udtrække nummeret og indsætte det i feltet.
Det er længe siden at jeg har brugt Toad til dataindtastning og kan ikke finde mapning af sekvenser mod tabelfelter nogle steder. Men kan du ikke bare indtaste, committe og reloade? Så er id feltet da udfyldt. Eller brug forms developer til at lave en indtastningsformular. Det tager to minutter hvis du bruger wizard\'en.
Jeg fandt det. I TOAD version 7.1.7.21 går du ind i schema browser, vælger din tabel og browser i data-tab\'en. Peg på dit id-felt, højreklik og vælg \"Set sequence field\". Voila. Det dur altså ikke i v6 og det var derfor jegg ikke kunne finde det på abrjdet, men først fandt det derhjemme.
Den version af TOAD jeg anvender er 6.3.3.1 og er i yderligere en prøveversion. Kunden er i første omgang ikke interesseret i at bruge penge på en licens. Ved du derfor om følgende vil virke?
Hvis jeg får kunden til at købe en licens på en version 7 hvor mapning er muligt og jeg efterfølgende fra Access opdaterer en af mine tabeller på Oracleserveren vil id-feltet så blive opdateret når jeg forlader et felt i rækken og ikke først når jeg forlader rækken?
Jeg har fået det til at fungere med VBA-kode ved at anvende et bookmark på Access-siden men det kører meget (for) langsomt.
Grunden til at jeg at har brug for at lade Oracle opdateret ID-feltet af sig selv når et felt forlades er at der på nuværende tidspunkt er lavet en masse access applikationer hvor der anvendes tabeller til at lagre forskellige data i. Mange steder anvendes moduler som benytter Access\' Seek metode som endvidere krævere dette autonummer så snart en værdi er indsat i en given rækken. Tabellerne skal nu flyttes over på en Oracleserver for at tune de enkelte systemer. Derfor kan jeg ikke lave forms på Oraclesiden da forms, forespørgsler, rapporter, moduler skal bibeholdes på Access-siden.
Jeg ved altså ikke hvordan du opdaterer Oracle tabeller fra Acces, men jeg kan forestille mig noget odbc involveret. I så fald tror jeg ikke at du skal regne med at se id\'en før rækken er forladt, og ikke kun feltet. Men i Toad v7 popper id\'en op med det samme.
Synes godt om
Ny brugerNybegynder
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.