pl/sql for-loop met cursor

  • Onderwerp starter Onderwerp starter BPsql
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

BPsql

Gebruiker
Lid geworden
30 sep 2009
Berichten
14
He mensen,

Ik ben bezig met een pl/sql opdracht, maar ik kom er maar niet uit.

Ik heb een tabel met auto merken en diens prijzen. Nu wil ik de prijzen van de opels en bmw's met 10% verhogen en de mercedes met 20%. De prijzen van de rest van de merken laat ik ongewijzigd. Alles moet gedisplayed worden in mijn hulptabel. Dit alles wil ik met for-loop met cursor doen.

Onderstaande heb ik al, maar mijn vraag is:
1. hoe geef ik aan?.....de rest van de automerken krijgt geen verhoging, maar
display deze wel in mijn hulptabel
2. kunnen de opel en bmw niet bij elkaar in 1 for-loop, omdat ze toch allebei 10%
verhoogd worden.


declare
cursor c_autos(b_merk varchar2) is
select merk,
prijs
from autos
where merk = b_merk;
v_newprijs number;
begin
v_newprijs := 0;
for r_autos in c_autos('opel') loop
v_newprijs := r_autos.prijs * 1.10;
insert into testhulptabel
values(r_autos.prijs,
v_newprijs,
r_autos.merk
);
end loop;
for r_autos in c_autos('bmw') loop
v_newprijs := r_autos.prijs * 1.10;
insert into testhulptabel
values(r_autos.prijs,
v_newprijs,
r_autos.merk
);
end loop;
for r_autos in c_autos('mercedes') loop
v_newprijs := r_autos.prijs * 1.20;
insert into testhulptabel
values(r_autos.prijs,
v_newprijs,
r_autos.merk
);
end loop;

end;
/

Alvast hartelijk dank,
 
Het makkelijkste is om één loop te doen voor alle autos, dus ook diegene die je niet wilt verhogen. Daarna kun je de prijs verhogen afhankelijk van het merk dat je tegenkomt door een if-statement in je loop op te nemen. Dat zal er dan ongeveer zo uitzien (niet getest):

[sql]declare

cursor c_autos is
select merk,prijs
from autos;

v_newprijs number := 0;

begin

for r_autos in c_autos loop

if r_autos.merk in ('opel','bmw')
then
v_newprijs := r_autos.prijs * 1.10;
elsif r_autos.merk = 'mercedes'
then
v_newprijs := r_autos.prijs * 1.20;
else
v_newprijs := r_autos.prijs;
end if;

insert into testhulptabel
values(r_autos.prijs,
v_newprijs,
r_autos.merk
);

end loop;

end;
/[/sql]
Succes met de opdracht!
 
PLS-00103: Encountered the symbol "end-of-file"

Dankjewel,

Dat ziet er veel strakker en netter uit. Ik ben het aan het testen, maar krijg de melding:

PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
begin case declare end exception exit for goto if loop mod


Hij struikelt over de END;....op het eind :D

Ik heb van alles geprobeerd, maar ik krijg de melding niet weg.....suggesties

Alvast bedankt
 
Ik zie zo even niets waar deze melding door kan komen. Kun je de laatste versie van het script hier nog eens plaatsen?
 
Het ziet er precies zo uit, als jij eerder aangaf.

declare

cursor c_autos IS
SELECT merk,prijs
FROM autos;

v_newprijs number := 0;

begin

FOR r_autos IN c_autos loop

IF r_autos.merk IN ('opel','bmw')
then
v_newprijs := r_autos.prijs * 1.10;
elsif r_autos.merk = 'mercedes'
then
v_newprijs := r_autos.prijs * 1.20;
else
v_newprijs := r_autos.prijs;
end IF;

INSERT INTO testhulptabel
VALUES(r_autos.prijs,
v_newprijs,
r_autos.merk
);

end loop;

end;
/
 
Bij mij werkt het zoals het hoort:[sql]SQL> declare
2
3 cursor c_autos IS
4 SELECT merk,prijs
5 FROM autos;
6
7 v_newprijs number := 0;
8
9 begin
10
11 FOR r_autos IN c_autos loop
12
13 IF r_autos.merk IN ('opel','bmw')
14 then
15 v_newprijs := r_autos.prijs * 1.10;
16 elsif r_autos.merk = 'mercedes'
17 then
18 v_newprijs := r_autos.prijs * 1.20;
19 else
20 v_newprijs := r_autos.prijs;
21 end IF;
22
23 INSERT INTO testhulptabel
24 VALUES(r_autos.prijs,
25 v_newprijs,
26 r_autos.merk
27 );
28
29 end loop;
30
31 end;
32 /

PL/SQL procedure successfully completed.

SQL> select * from testhulptabel;

PRIJS NIEUWPRIJS MERK
---------- ---------- --------------------
1000 1000 ford
2000 2200 bmw
3000 3600 mercedes

3 rows selected.[/sql]

Blijkbaar gaat er iets anders mis.
 
bedankt

Oke, dan moet het dus iets op database niveau zijn.

Ik heb al even rondgekeken op andere fora en daar werd ook al gezegd dat het te maken kan hebben met de database versie. Ik draai hier volgens mij op 8 of 9.

Dat is balen, maar op school hebben we een veel nieuwere versie.

Ik ga ervan uit dat hij zo goed is en anders pas ik hem iets aan, want de grote lijnen zijn dan sowieso goed.



Super bedankt Epic :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan