Avatar billede mundt Nybegynder
21. september 2001 - 14:07 Der 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?
Avatar billede nosjns Nybegynder
21. september 2001 - 14:12 #1
Så skal du på selecte sekvensen, når du i access opretter en ny række, istedet for som nu at gøre det når du \"gemmer\" din række i databasen.

Nu har jeg ikke den store erfaring med access, så jeg kan ikke lige fortælle dig, hvordan du skal gøre.
Avatar billede pgroen Nybegynder
21. september 2001 - 14:13 #2
Jeg er ikke helt klar over hvad du mener, men du kan referere til den NUVÆRENDE værdi af sekvensen med
cntBatch.CURRVAL...
Avatar billede teepee Nybegynder
21. september 2001 - 14:14 #3
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.
Avatar billede teepee Nybegynder
21. september 2001 - 14:16 #4
Lad evt triggeren ligge i databasen og indsæt:
  IF :NEW.BatchID IS NULL THEN
    SELECT...
  END IF;

Avatar billede mundt Nybegynder
26. september 2001 - 12:15 #5
Hvad skal jeg skrive i min SELECT sætning?

IF :NEW.BatchID IS NULL THEN
  SELECT...
END IF;

Gør ovenstående at jeg får opdateret mit autonummer inden rækken forlades?

Avatar billede teepee Nybegynder
26. september 2001 - 12:23 #6
Træk et nummer...

SELECT cntBatch.NEXTVAL
INTO midlertidig_variabel
FROM dual;

og når du skal indsætte...

INSERT INTO Batch(BatchId,...)
VALUES(midlertidig_variabel,...);
Avatar billede mundt Nybegynder
26. september 2001 - 12:29 #7
Det gør jeg egentlig allerede. Min trigger ser ud som nedenstående:

TRIGGER trgCntBatch
BEFORE INSERT ON Batch
FOR EACH ROW
BEGIN
    SELECT cntBatch.NEXTVAL INTO :NEW.BatchID FROM dual;
END;

Mit problem er at min trigger først indsætter en ny værdi når jeg forlader rækken i tabellen.
Avatar billede teepee Nybegynder
26. september 2001 - 13:03 #8
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).
Avatar billede mundt Nybegynder
26. september 2001 - 13:23 #9
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.
Avatar billede teepee Nybegynder
26. september 2001 - 13:36 #10
Så er det at du selv skal udtrække et nummer og indsætte dette i stedet for at lade Oracle gøre det for dig.
Avatar billede mundt Nybegynder
26. september 2001 - 13:40 #11
Hvorhenne?

Min trigger bliver jo først aktiveret når jeg forlader rækken - betyder det så at jeg skal lave en trigger mere?
Avatar billede teepee Nybegynder
26. september 2001 - 13:48 #12
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.
Avatar billede mundt Nybegynder
26. september 2001 - 13:51 #13
I øjeblikket anvender jeg TOAD og der siger du at jeg kan mappe en sequence til et felt - hvordan?
Avatar billede mundt Nybegynder
27. september 2001 - 13:57 #14
Jeg gerne vil bare gerne vide er om jeg skal anvende kode eller om det gennem en af Toad\'s menuer?

Hvis det er kode har du så et eksempel?
Avatar billede teepee Nybegynder
27. september 2001 - 14:09 #15
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.
Avatar billede teepee Nybegynder
27. september 2001 - 16:18 #16
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.
Avatar billede mundt Nybegynder
28. september 2001 - 08:33 #17
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.
Avatar billede mundt Nybegynder
28. september 2001 - 08:48 #18
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.

Håber dette skaber klarhed på mit problem!!!
Avatar billede teepee Nybegynder
28. september 2001 - 09:25 #19
Min v7 er også en prøveversion, downloaded fra quest.com
Avatar billede mundt Nybegynder
28. september 2001 - 09:43 #20
Jeg har i øjeblikket problmer med at downloade.

Hvad siger du i mellemtiden til mit spørgsmål skrevet 28/09 2001 08:33:13?
Avatar billede teepee Nybegynder
28. september 2001 - 10:02 #21
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.
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