Update Oracle tabel aan dehand van lijst

Pagina: 1
Acties:

  • Ppieter
  • Registratie: April 2005
  • Laatst online: 27-08 16:32
Beste mensen,
Ik wil een update van een tabel. Bedoeling is dat een bepaald veld in de tabel waarvoor geld komt voor in de lijst een waarde krijgt.
Ik stel me voor dat er een soort loop moet worden gemaak maar ik weet niks van oracle.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Misschien handig dat je je eerst eeens gaat verdiepen in wat je moet gaan doen? Ik neem aan dat je deze opdracht niet voor niets hebt gekregen.
Een tabel updaten is bassiskennnis voor iemand die met een database kan werken. Daarnaast zijn er boeken en tutorials die je dit kunnen leren dus ik stel voor dat je eens een kijkje gaat nemen ;).

Daarnaast verwachten we meer van een topicstart dan dat je nu laat zien. Als je Programming Beleid eens door wilt lezen (en dan met nameProgramming Beleid - De Quickstart) dan weet je wat we van een topicstart verwachten.

[ Voor 32% gewijzigd door Creepy op 24-05-2007 14:44 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Ppieter
  • Registratie: April 2005
  • Laatst online: 27-08 16:32
Beste Creepy,

Bedankt voor je reactie, (al is die niet helemaal wat ik had gehoopt).

Natuurlijk is het verstandig me eerst in PL/SQL te verdiepen. Ik werd met een haastklusje opgezadeld, en heb eerst gezocht naar een antwoord op deze vraag. Niet gevonden.

Inmiddels begrijp ik dat mijn post hier niet op z'n plaats is.

Groet,

Ppieter

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Volgens mij kan dit topic op zich best hier. Jezelf verdiepen in Oracle is wel een goede tip overigens.

Een aantal vragen:
- de lijst, hoe ziet die eruit en waar komt die lijst vandaan?
- De waarde die je in het veld zet, waar komt die vandaan?

  • Ppieter
  • Registratie: April 2005
  • Laatst online: 27-08 16:32
Hallo Bigben,

Bedankt voor je reactie. Overigens: het betreft een update in een tabel als onderdeel van een work-around.
De lijst is aangeleverd. Het bevat cursistennummers. Voor alle cursisten die in de lijst voorkomen moet een veld in een tabel op 'J' worden gezet. De lijst is 440 studenten lang, en dat vond ik wat veel om in een In( ) clause te zetten.
Dat laatste werkt overigens prima, heb ik daarnet ondervonden. Dit probleem heeft daarom geen urgentie meer, maar ik blijf me afvragen hoe je in een Oracle database dit soort lijst in je Update queries kan gebruiken.
Ik kan me voorstellen dat het nogal afhankelijk is van de manier waarop de database is opgezet en geïnstalleerd.

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 28-11 09:35

leuk_he

1. Controleer de kabel!

Over het algemeen ga je als volgt te werk:

Lees de lijst in een een verwerkings tabel. (STAGING_LIJST)
SQLLDR is een goede tool om de tijdelijke tussen tabel te vullen

Schrijf vervolgens een kliene pl/sql die de recods doorzet in de definitieve tabel

zoiets: (niet gecompileerd...)
code:
1
2
3
4
5
6
7
8
9
10
Declare
cursor c_staging is select * from staging_lijst;
BEGIN
for rec_staging in c_staging 
loop
update FINAL_LIJST set fieldlijst = rec_staging.stagingveld
where  FINAL_LIJST.KEYnaam= rec_staging.keynaam;
end loop;
commit;
end;

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


  • Ppieter
  • Registratie: April 2005
  • Laatst online: 27-08 16:32
Hallo Leuk_he,

Bedankt voor je reactie.
Ik ga er verder mee aan de slag. Weet echter niet wanneer, vermoedelijk pas na pinksteren, want ik heb thuis geen Oracle database draaien.

Fijne dagen!

Verwijderd

Geen cursor for-loop gebruiken in ieder geval, als je het in één statement kan vatten, want daar lijkt het hierop. Dan krijg je dus zoiets als:
SQL:
1
2
3
4
update lijst l
set l.janee = 'J'
where  l.stu_id in( select s.stu_id
                    from   staging s )

(Effe code tag opgezocht)

[ Voor 45% gewijzigd door Verwijderd op 25-05-2007 14:13 ]


  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 28-11 09:35

leuk_he

1. Controleer de kabel!

Verwijderd schreef op vrijdag 25 mei 2007 @ 13:51:
Geen cursor for-loop gebruiken in ieder geval, als je het in één statement kan vatten, want daar lijkt het hierop. Dan krijg je dus zoiets als:
SQL:
1
2
3
4
update lijst l
set l.janee = 'J'
where  l.stu_id in( select s.stu_id
                    from   staging s )

(Effe code tag opgezocht)
Ja, wat jij schrijft is veel sneller (wat je niet merkt met 440 records, maar wel met een veelvoud)

Echter Via een loop ben je veel flexibeler. Wat ik er niet bijzet is dat je voor echte productie systeemen elke 1000 records een commit doet (rollback segmenten lopen anders vol) , een status in de STAGING tabel bijhoud (zodat het herstartbaar is) en met SQL%count de update gaat testen en een insert gaat doen als het record nog niet bestaat. Voor de topic starter is dat een beetje overkill.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


  • Ppieter
  • Registratie: April 2005
  • Laatst online: 27-08 16:32
Hallo Leuk_he,
Voor de topic starter is dat een beetje overkill.
Goed ingeschat

Verwijderd

leuk_he schreef op vrijdag 25 mei 2007 @ 14:19:
[...]


Ja, wat jij schrijft is veel sneller (wat je niet merkt met 440 records, maar wel met een veelvoud)

Echter Via een loop ben je veel flexibeler. Wat ik er niet bijzet is dat je voor echte productie systeemen elke 1000 records een commit doet (rollback segmenten lopen anders vol) , een status in de STAGING tabel bijhoud (zodat het herstartbaar is) en met SQL%count de update gaat testen en een insert gaat doen als het record nog niet bestaat. Voor de topic starter is dat een beetje overkill.
Dan is je rollback segment te klein. Een transactie duurt zolang een transactie duurt. Oracle houdt erg van lange transacties, dat in tegenstelling tot MS-SQL server i.v.m. read locks.
Zo'n row-by-row (eigenlijk slow-by-slow) is altijd trager t.o.v. één statement.

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 28-11 09:35

leuk_he

1. Controleer de kabel!

Verwijderd schreef op vrijdag 25 mei 2007 @ 15:13:
[...]

Dan is je rollback segment te klein. Een transactie duurt zolang een transactie duurt. Oracle houdt erg van lange transacties, dat in tegenstelling tot MS-SQL server i.v.m. read locks.
Zo'n row-by-row (eigenlijk slow-by-slow) is altijd trager t.o.v. één statement.
Je rollback segmant kun je niet altijd zomaar laten uitbreiden. Hoewel dat op recente oracle versie beter geregeled is(als je het maar op auto zet...). Als je een systeem hebt waar je zowel batch als honderden interactieve gebruikers moet draaien dan kun je niet ongebreideld grote rollback segmenten gebruiken zonder eerst heel veel ruzie te maken met de DBA.

zo'n row voor row is flexibeler. ALs je het af kan met 1 enkel update statment heeft dat de voorkeur, maar vaak moet je update of insert doen, en ook fouten afhandelen. Dat wordt onleesbaar in 1 enkel statement en nog slechter te onderhouden. Verder zijn we het geloof ik wel eens hoor.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.

Pagina: 1