Function zum Aufsummieren eines bst. Wertes

dave_christopher

Aktiver Benutzer
Beiträge
31
Hallo zusammen,

ich brauche Hilfe bei einer PL/SQL Funktion.
Beispielsweise habe ich eine Tabelle mit den Feldern ID, TNR, Stunden.
Ich möchte nun mit einer Funktion, bei welcher ich die TNR übergebe, die Summe aller entsprechenden Stunden zurückgeben.
Grob habe ich mir folgendes überlegt:
2 Variablen deklarieren, Cursor definieren + durchlaufen, Aufsummieren, Summe ausgeben.

Aber könnt ihr mir anhand eines Beispiels zeigen wie ich das konkret in einer Funktion umsetze?

Herzlichen Dank für Eure Hilfe!

Viele Grüße
Dave
 
Werbung:
Ja schon :)
Mir geht es allerdings darum, mich etwas mit Funktionen bei PL/SQL auseinanderzusetzen.
Das Ganze soll nur ein simples Beispiel sein, unabhängig, das es mit einen Statement selbstverständlich einfacher ginge.
 
Es würde evtl. schon helfen, wenn jemand das exemplarisch auf Basis einem anderen DB-System zeigen könnte. Evtl. auch PG? So große Unterschiede dürfte es da doch eigentlich nicht geben.
 
Code:
create of replace function mysum (p_tnr number) return number is
l_sum number:=0;
begin
for i in (select ... from ... where tnr = p_tnr) loop
l_sum:=l_sum+i.xyz;
end loop;
return l_sum;
end;

select mysum(123) from dual;
Explizite Cursor braucht man nicht mehr sooft, seit es das for Loop Konstrukt gibt. Mit der Variablen i (Namen kannst frei wählen) greifst auf die Spalten deines SQL zu.
Damit brauchst dich nicht mehr um das Open und Close kümmern, außerdem wird von der Engine direkt ein Prefetch vorgenommen, sprich es werden im Hintergrund immer gleiche 100 Zeilen gelesen, damit nicht jedesmal ein Kontextswitsch zwischen PLSQL und SQL vorgenommen werden muss.

PS: Doch die Unterschiede zwischen Oracle und PG sind schon relevant.
 
Sehr vielen Dank (auch zu den Erläuterungen). Das hilft mir schon sehr weiter.
Das Statement in der Schleife wäre dann in etwa "
select * from tabelle where tnr = p_tnr" Die schleife läuft dann so oft, wie Zeilen durch dieses Statement ermittelt wurden, richtig?

Wie ist das "i.xyz" zu interpretieren?

Oder müsste es korrekt so aussehen:

Code:
create of replace function mysum (p_tnr number) return number is
l_sum number:=0;
begin
for i in (select stunden from tabelle where tnr = p_tnr) loop
l_sum:=l_sum+i.stunden;
end loop;
return l_sum;
end;

select mysum(123) from dual;
 
Zuletzt bearbeitet:
Richtig. xyz ist stellvertretend für den echten Spaltennamen.
Select * sollte man vermeiden. Schreib nur Spalten hin, die dich interessieren und den Rest läßt du weg.
 
Werbung:
Zurück
Oben