[oracle-VB] laatste ID van trigger lezen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Anoniem: 90289

Topicstarter
Hoi, als ik een record toevoeg in een tabel in oracle met visual basic dan zorgt de trigger voor de autonummering van mijn ID veld. Nou moet ik dat nummer ook weer wegschrijven in een andere tabel. Hoe kan ik de laatste ID uitlezen? Er kunnen meerdere mensen tegelijk records toevoegen dus gewoon de hoogste ID waarde uitlezen heeft geen zin. Ik moet de ID hebben van dezelfde sessie.

[edit]
Ik heb net ergens gelezen dat @@SCOPE_IDENTITY wordt gebruikt om de laatste id die door de sequence is aangemaakt in dezelfde sessie terug te krijgen. Maar ik heb deze optie niet terug kunnen vinden in oracle. Weet iemand hoe je deze of iets soortgelijks kan gebruiken met oracle?

[ Voor 28% gewijzigd door Anoniem: 90289 op 06-11-2003 21:53 ]


Acties:
  • 0 Henk 'm!

Anoniem: 90289

Topicstarter
Is er echt niemand die iets weet over oracle en visual basic? Ik heb me kapot gezocht maar kan niks vinden, terwijl dit een probleem is waar iedereen mee zit die een beetje een database in oracle heeft en daarop een applicatie in VB heeft draaien. PLEASE.....ik kom er niet uit.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:20
de scope_identity() is een SQL Server functie, geen Oracle functie.

Oracle werkt met sequences.
Wat je kunt doen is eerst het sequence nummer van het nieuwe record bepalen, en dan dat nummer meegeven in je INSERT, en ook aan de INSERT voor de andere tabel.
Je gaat die volgende sequence dus niet in je trigger gaan bepalen.

pseudo-code
code:
1
2
3
4
int primkey = cmd.Execute("SELECT mysequence.nextval FROM dual");

cmd.Execute("INSERT INTO tabel (id, naam) VALUES (" + primkey.ToString() + ", \'whoami\')");
cmd.Execute("INSERT INTO tabel2 (pk, blaat) VALUES (" + primkey.ToString() + ", \'blaat\')");

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Anoniem: 90289

Topicstarter
bedankt voor je reactie. Ik moet dus de trigger uit de database halen om te voorkomen dat oracle zelf de sequence uitvoert? Nou heb ik wel een vraag: Er werken 20 gebruikers tegelijkertijd aan deze tabel, loop ik door dit systeem niet het risico dat de ID's niet meer kloppen als meerdere mensen tegelijk een record toevoegen. (m.a.w is dit een waterdicht systeem?)

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:20
Je kan je trigger aanpassen, zodat, mocht je toch ergens een INSERT hebben waar je de sequence zelf niet meegeeft, dat die dan toch automatisch wordt ingevuld:

code:
1
2
3
if :new.id is null then
   select mysequence.nextval into :new.id from dual;
end if;


Een sequence-nummer kan je slechts 1x afhalen. Het systeem kan je wel als waterdicht beschouwen.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Anoniem: 90289

Topicstarter
Ok, bedankt voor de oplossing.

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Een insert statement heeft een returning clausule welke je hiervoor kunt gebruiken.

Who is John Galt?


Acties:
  • 0 Henk 'm!

Anoniem: 90289

Topicstarter
en hoe ziet die er uit?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:20
Check misschien ff je manual , 't staat er letterlijk in.

code:
1
RETURNING [row_expression] INTO [variable]

[ Voor 15% gewijzigd door whoami op 07-11-2003 12:02 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Anoniem: 90289

Topicstarter
Ben nu de return value aan het testen omdat dat denk ik sneller gaat dan de andere oplossing (die werkt trouwens goed!). Maar waarom werkt die query niet?

INSERT INTO VRAGEN (VRAAG,ANTWOORD,CATID,AANTAL) VALUES ('test','test','135','1') RETURN ID INTO :Val

Ik run het in SQL*PLUS -> die zegt: 1 rij is aangemaakt

Dan doe ik: PRINT Val;
en die geeft de waarde van de Val weer (56);

MAAR ER WORDT GEEN RECORD TOEGEVOEG IN DE TABEL??? :?:?

Als ik de query via de recordsource van mijn ado control in visual basic run en dan mijn adocontrol refresh dan klapt visual basic er uit. ???

Acties:
  • 0 Henk 'm!

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 16:30
vergeet niet te comitten, of zeg ik nu iets stoms.?

intergalactic.fm


Acties:
  • 0 Henk 'm!

Anoniem: 90289

Topicstarter
wat bedoel je daarmee? (ik ben een hobby programmer, ik ken geen theoretische termen uit de boeken _/-\o_

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Ik zou eens in een tutorial gaan kijken hoe transacties en locks werken, dat ga je nodig hebben.

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:20
Eh, ja....
Een transactie committen.

Als je een term ziet die je niet begrijpt, dan kan je 't zelf ook altijd eens gaan opzoeken wat de betekenis ervan is. Zo leer je nog eens wat bij.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Anoniem: 90289

Topicstarter
Ik heb alle query's even los geprobeerd in SQL*Plus. Ook even het commit gebeuren er bij en inderdaad nu werkt alles. Maar als ik deze query's in mijn recordsource van mijn ado control stop dan werkt het voor geen meter.

adoVragentabel.recordsource="INSERT INTO VRAGEN (VRAAG,ANTWOORD,CATID,AANTAL) VALUES ('test','test','135','1') RETURN ID INTO :Val"

werkt bijvoorbeeld niet. Als ik de query los uitvoer in SQL*Plus wel.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:20
Tja....

VB kent die :val niet natuurlijk.

Kan je in VB geen gebruik maken van parametrized queries?
Hier vind je een voorbeeldje erover, 't is wel in .NET, maar het concept is hetzelfde.
P&W FAQ - SQL

Je kan dan die variable die je in de RETURNING clause zet, als parameter definieren, en de parameter waarde dan uitlezen.

https://fgheysels.github.io/

Pagina: 1