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

SQL Cursor

Dieses Thema im Forum "Oracle" wurde erstellt von blackbolt, 13 Februar 2014.

  1. blackbolt

    blackbolt Benutzer

    Hallo zusammen,

    Cursor sind für mich Neuland und habe daher einige Startschwierigkeiten.

    Ausgangssituation:
    Ich habe folgende Tabelle (vereinfacht):

    Auftrag Abweichung Bewertung
    1///////-1//////////
    1///////3//////////
    1///////2//////////
    2///////0//////////
    2///////1//////////
    2///////2//////////
    2///////-1//////////
    3///////1//////////
    3///////3//////////

    Die Spalte Bewertung is aktuell leer. Diese soll aber gefüllt werden und zwar wie folgt.

    Auftrag Abweichung Bewertung
    1///////-1//////////0
    1///////3//////////4
    1///////2//////////-1
    2///////0//////////0
    2///////1//////////1
    2///////2//////////1
    2///////-1//////////-3
    3///////1//////////0
    3///////3//////////2

    im Prinzip ist es immer die differenz der ersten und folgenden Abweichung. Außer bei einem neuen Auftrag.
    Da soll immer die 0 stehen.

    folgende Grundstruktur habe ich erstellt.


    CREATE OR REPLACE PROCEDURE DB.TEST

    IS

    cursor cur_test is
    Select * TABELLE
    for update;

    v_Fehler number;
    v_Meldung Varchar(1000);


    vi_Auftrag DB.TABELLE.AUFTRAG%type;

    BEGIN

    for v_ds in cur_test loop

    update t_t7000_plus_urs_test
    set BEWERTUNG = 'TEST';
    -- test

    end if;
    end loop;
    commit;

    end;

    Hat jmd ein einfaches Beispiel an dem ich mich orientieren kann?
    Ich bin für jegliche Unterstützung dankbar!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Dazu brauchst Du weder Cursor noch eine Funktion, das geht mit einem Select.

    Zuerst einmal aber: Tabellen kennen keinen Vorgänger / Nachfolger, die Reihenfolge der Rows in der Tabelle ist Zufall. Ordnung bekommst Du erst mit einer Definition, nach was und wie sortiert werden soll. Wenn Du das in der genannten reihenfolge haben willst, wäre z.B. eine ID-Spalte, die via SERIAL hochzählt, passend. Dafür brauchst Du aber die Bewertungs-Spalte nicht, denn die ist berechenbar. Willst Du das als Spalte sehen, reicht ein View.

    Doch der Reihe nach. Du hast diese Tabelle, mit einer von mir eingefügten id-Spalte:

    Code:
    test=*# select * from blackbolt ;
     id | auftrag | abweichung
    ----+---------+------------
      1 |  1 |  -1
      2 |  1 |  3
      3 |  1 |  2
      4 |  2 |  0
      5 |  2 |  1
      6 |  2 |  2
      7 |  2 |  -1
      8 |  3 |  1
      9 |  3 |  3
    (9 rows)
    
    Und non das Select, ich nutze lag(), das kann auch Oraggle (ich habe PostgreSQL):

    Code:
    test=*# select *, coalesce(abweichung - lag(abweichung) over (partition by auftrag order by id),0) from blackbolt ;
     id | auftrag | abweichung | coalesce
    ----+---------+------------+----------
      1 |  1 |  -1 |  0
      2 |  1 |  3 |  4
      3 |  1 |  2 |  -1
      4 |  2 |  0 |  0
      5 |  2 |  1 |  1
      6 |  2 |  2 |  1
      7 |  2 |  -1 |  -3
      8 |  3 |  1 |  0
      9 |  3 |  3 |  2
    (9 rows)
    
    Liefert exakt das, was Du suchst, oder?
     
    ukulele gefällt das.
  3. blackbolt

    blackbolt Benutzer

    Tolle Idee Danke! Das hilft mir sehr!

    ~ closed ~
     
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