Oracle PL/SQL: Cursor in Cursor

Hallo!

Irgendwie stehe ich auf der Leitung - ich brauche zwei ineinandergreifende Cursor. Hier nur ein Beispiel, in welcher Art ich die Cursor benötige:

CURSOR emplo\_cursor IS
 SELECT \* FROM employees

FOR emplo\_rec IN emplo\_cursor LOOP

 CURSOR order\_cursor IS
 SELECT \* FROM orders WHERE emplo.id = emplo\_rec.id

 FOR order\_rec IN order\_cursor LOOP
 ...
 END LOOP;

END LOOP;

Der Grund, warum ich zwei ineinandergreifende Cursor brauch ist der, dass ein großer Cursor mit Joins über mehrere Tables mir alle Resourcen raubt bzw. nicht performant ist.

Eine Idee?

Danke, Stefan.

Hi Stefan,

vielleicht hilft dir u.a. Beispiel weiter. Ich arbeite in letzter Zeit nicht mehr viel mit PLSQL, hab das Ding aber noch auf einer CD gefunden. Daher ist ein bischen viel Schnick-Schnack drumrum.


Declare
Summe number(1);
CURSOR c_Menge IS
select h.Bezeichnung As Herstellerbez, h.hersteller_nr AS Herstellernummer, count(*) As Anzahl
from Hersteller h, hersteller_typ ht
where ht.hersteller_nr = h.hersteller_nr
group by h.bezeichnung, h.hersteller_nr
– having count (*) >=5; wenn bereits hier gefiltert wird
order by h.bezeichnung;

CURSOR c_typ( p_HerstellerNr Hersteller.Hersteller_nr%Type) IS --oder number
select t.bezeichnung As Typbezeichnung
from typ t, hersteller_typ ht
where ht.typ_nr = t.typ_nr
and ht.hersteller_nr = p_HerstellerNr
order by t.typ_nr;

BEGIN
Summe:=0;
For rec_Ausgabe1 in c_Menge LOOP
if rec_Ausgabe1.Anzahl >=5 Then
dbms_output.put_line(‚Hersteller :‘||
’ '||rec_Ausgabe1.Herstellerbez||
’ ‚||‚Anzahl vorhandener Typen :‘||
’ ‚||to_char(rec_Ausgabe1.Anzahl));
for rec_Ausgabe2 in c_typ(rec_Ausgabe1.Herstellernummer) LOOP
dbms_output.put_line(rec_Ausgabe2.Typbezeichnung);
Summe:=1;
END LOOP; --Schleife Typausgabe ende
End if;
END LOOP;-- Schleife Menge ende
if Summe = 0 Then
dbms_output.put_line(‘------------Kein Datensatz vorhanden--------------‘);
End if;
END;
/

Grüße

Ratloser

hi!

steh ich auch auf der leitung (ich sehe kein problem!!), oder könnte ein …

declare
CURSOR emplo_cursor IS
SELECT * FROM employees;
CURSOR order_cursor (emplo_id in orders.emplo_id%TYPE)
IS
SELECT * FROM orders WHERE emplo.id = emplo_rec.id
begin
for ec in emplo_cursor loop
for oc in order_cursor(emplo_cursor.id) loop

end loop;
end loop;
end;

… die lösung sein?

grüße,
tomh

for oc in order_cursor(emplo_cursor.id) loop

soll natürlich
„for oc in order_cursor(ec.id) loop“
heißen

Hi TomH!

Ja, so kenn ich das auch - verhindert aber nicht, dass ich 2 riesen große Cursor bekomme, oder liege hier falsch?

Danke, Stefan.

Zu welchem Zeitpunkt

for oc in order_cursor(emplo_cursor.id) loop

soll natürlich
„for oc in order_cursor(ec.id) loop“
heißen

for oc in order_cursor(emplo_cursor.id) loop

soll natürlich
„for oc in order_cursor(ec.id) loop“
heißen

hi!

die folge sind „große“ cursor (was verstehst du darunter? datenmenge? performance?) … je nachdem, wo das problem liegt, gehe ich zumindest von unterschiedlichen ansätzen aus … (in der heutigen zeit darf ein mengenmäßig großer cursor im normallfall kein problem mehr für die hardware bzw. db- und tablespace-einstellungen sein)

grüße,
tomh

…leider ist’s nicht für mich sondern für einen Kunden. Und der hat massivste Plattenplatzprobleme (um div. Segmente zu vergrößern).

Grüße, Stefan.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]