[ORACLE] sequence insert

Pagina: 1
Acties:
  • 185 views sinds 30-01-2008
  • Reageer

  • Johny58
  • Registratie: Juni 2002
  • Laatst online: 12-04 16:06
Ik ben bezig met het maken van een java aplicatie die gegevens in een tabel zet doormiddel van SQL.
De java applicatie vult 4 van de 5 kolommen maar de laatste zou ik automatisch gevuld willen hebben door een sequence die ik heb aangemaakt: ordernr_seq

Dit is de tabel

CREATE TABLE onderdelen
(
merknr VARCHAR2(5) ,
onderdeelnr NUMBER(5) ,
onderdeelnr2 NUMBER(5) ,
onderdeelnr3 NUMBER(5) ,
ordernr NUMBER(5) DEFAULT ordernr_seq.nextval,
CONSTRAINT pk_ordernr PRIMARY KEY(ordernr,merknr),
CONSTRAINT fk_merknr FOREIGN KEY (merknr) REFERENCES automerk (merknr));

Zoals je ziet probeer ik doormiddel van DEFAULT de tabel te vullen met een gegenereerd getal. Maar op deze manier doet hij het niet. Weet er iemand een manier om het voor elkaar te krijgen zonder iets te veranderen in de JAVA aplicatie?

"Hippopotomonstrosesquippedaliophobia" is the term used to describe the fear of long words.


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 18:26
Kun je een trigger aanmaken in de database?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Je kan een INSERT trigger maken voor die tabel waarin je je ordernr in gaant opvallen:

code:
1
2
3
4
CREATE trigger blaat BEFORE INSERT ON mytabel FOR EACH ROW
BEGIN
SELECT ordernr_seq.nextval INTO :new.ordernr FROM dual;
END;

[ Voor 19% gewijzigd door whoami op 14-10-2003 15:21 ]

https://fgheysels.github.io/


  • Surehand
  • Registratie: Februari 2003
  • Laatst online: 18-08 15:40
Drie opmerkingen:
  1. Waarom maak je een samengestelde primary key als je een gegenereerd ordernummer wilt gebruiken?
  2. Waarom gebruik je de sequence.nextval niet gewoon in je insert-query?
    code:
    1
    
    insert into tabel(...) values (...,sequence.nextval,...)
  3. Default waarde kun je alleen gebruiken om een bepaalde waarde in te vullen als je niets voor die kolom invult, er is geen auto_increment in oracle

  • Johny58
  • Registratie: Juni 2002
  • Laatst online: 12-04 16:06
whoami schreef op 14 October 2003 @ 15:19:
Je kan een INSERT trigger maken voor die tabel waarin je je ordernr in gaant opvallen:

code:
1
2
3
4
CREATE trigger blaat BEFORE INSERT ON mytabel FOR EACH ROW
BEGIN
SELECT ordernr_seq.nextval INTO :new.ordernr FROM dual;
END;
Dus als ik dit dus gewoon invoer na mn create table statement en na het aanmaken van me sequence moet ie het gewoon doen als ik het goed begrijp.

"Hippopotomonstrosesquippedaliophobia" is the term used to describe the fear of long words.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Ja.
Daarmee maak je een trigger aan die iedere keer uitgevoerd wordt als je een record in die tabel insert.

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Toch is het het beste om gewoon je sequence.NEXTVAL als value te nemen voor je column in de insert. Triggers zijn erg leuk, maar ze zitten verborgen en je vergeet ze snel.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 18:26
Misschien offtopic, maar is er ook een performance verschil tussen het gebruik van een trigger (lees: _deze_ trigger) of het opnemen van sequence.NEXTVAL? Ik gebruik nml. de eerste variant en ik merk dat bij grote aantallen inserts (100k+) het beter werkt om vanuit de aansturende programmatuur een gegenereerde ID aan te leveren ipv het gebruik van een trigger. En dan is beter een factor 10 in snelheid...

  • EfBe
  • Registratie: Januari 2000
  • Niet online
trigger is een aparte procedure die in dezelfde transaction draait als het statement DAT de trigger triggert. Het is dus altijd aan te bevelen om een trigger te omzeilen tenzij het niets uitmaakt. In dit geval maakt het wel wat uit, je kunt de trigger elimineren door direct sequence.NEXTVAL te gebruiken in het INSERT statement

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Het wel of niet gebruiken van een trigger heeft meer te maken met de modulariteit die je wilt bereiken.
Het opnemen van de sequence.nextval zal waarschijnlijk performance winst leveren bij grote bulk insert statements, maar kan dit soort technische zaken binnen je functioneel gerichte programmatuur brengen.

Who is John Galt?


  • EfBe
  • Registratie: Januari 2000
  • Niet online
justmental schreef op 15 oktober 2003 @ 12:22:
Het wel of niet gebruiken van een trigger heeft meer te maken met de modulariteit die je wilt bereiken.
Het opnemen van de sequence.nextval zal waarschijnlijk performance winst leveren bij grote bulk insert statements, maar kan dit soort technische zaken binnen je functioneel gerichte programmatuur brengen.
Lijkt me wat overdreven. Het besluit HOE een veld van WELKE waarde wordt voorzien is nl. allang genomen: middels een sequence. Daaruit volgt maar 1 ding: hoe voorzie je zo efficient mogelijk het veld van de sequence value.

Ik geef je gelijk dat een trigger een optie moet blijven wanneer je geen besluit hebt genomen HOE je een veld van een value gaat voorzien of wanneer dat flexibel moet zijn (bv soms sequence X, soms sequence Y, of output van functie bv). Maar dat is IMHO een discussie die je voert buiten de context van de vraagstelling, immers daar is de beslissing al genomen. :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

EfBe schreef op 15 October 2003 @ 12:44:
Lijkt me wat overdreven. Het besluit HOE een veld van WELKE waarde wordt voorzien is nl. allang genomen: middels een sequence. Daaruit volgt maar 1 ding: hoe voorzie je zo efficient mogelijk het veld van de sequence value.
De beslissing is al wel genomen, maar gewijzigde inzichten zijn er altijd wel.
De keuze voor een ontkoppeling van dergelijke technische zaken als een technische sleutel lijkt me vaak belangrijker dan de performance winst.

Who is John Galt?


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 18:26
In mijn geval is performance belangrijker, ook al is de beslissing voor triggers ooit al genomen. Ik ga in ieder geval proberen om bij de bottlenecks de trigger uit te schakelen en een directe NEXTVAL insert te gebruiken.
Pagina: 1