SQL Cursor

blackbolt

Benutzer
Beiträge
6
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!
 
Werbung:
Hallo zusammen,


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

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?
 
Werbung:
Zurück
Oben