Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Function zum Aufsummieren eines bst. Wertes

Dieses Thema im Forum "Oracle" wurde erstellt von dave_christopher, 14 Februar 2017.

  1. dave_christopher

    dave_christopher Aktiver Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    warum eine Funktion? select sum(stunden) from tabelle where id = deine_nummer würde es doch auch tun, oder?
     
  3. dave_christopher

    dave_christopher Aktiver Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Ah okay. Nun, ich mache kein Oraggle, ich PG würde es aber so in etwa gehen wie von Dir genannt.
     
  5. dave_christopher

    dave_christopher Aktiver Benutzer

    Das ist schon mal gut zu hören! :cool:
    Und wie würde das dann konkret in einer Funktion aussehen?
    Evtl. kennt sich hier ja jemand mit Oracle aus?
     
  6. dave_christopher

    dave_christopher Aktiver Benutzer

    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.
     
  7. drdimitri

    drdimitri Datenbank-Guru

    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.
     
  8. dave_christopher

    dave_christopher Aktiver Benutzer

    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: 15 Februar 2017
  9. drdimitri

    drdimitri Datenbank-Guru

    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.
     
  10. dave_christopher

    dave_christopher Aktiver Benutzer

    Super vielen Dank Dimitri!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden