Incrementierung i

Liebe/-r Experte/-in,

ich habe ein tabelle studenten:
Lock_seq Name vorname zusatz
100 Muster Mann 1
200 Muster Mann 1
300 Muster Mann 1
400 Axel Schenke 1
500 Axel Schenke 1

und ich möchte, dass für jede gleiche name und vorname ein incrementierung auf zusatz machen(UPDATE):

Lock_seq Name vorname zusatz
100 Muster Mann 1
200 Muster Mann 2
300 Muster Mann 3
400 Axel Schenke 1
500 Axel Schenke 2

ich hab ein script in PL/SQL geschrieben leider functioniert irgendwie nicht ich hab ein Test beispiel:

CREATE OR REPLACE PROCEDURE AGSV2.savetest
IS
i NUMBER:=1;

cursor c1
IS
SELECT lock_seq,name,zusatz
FROM test WHERE name
IN (SELECT name FROM (SELECT count(*) c,name
FROM test
GROUP BY name,zusatz
HAVING count(*)>1)
) ORDER BY 1;
cursor c2
IS
SELECT count(*) c
FROM test
GROUP BY name,zusatz
HAVING count(*)>1;

BEGIN

FOR c1_rec IN c1 LOOP
FOR c2_rec IN c2 LOOP
WHILE i

Sorry, habe leider überhaupt keine Ahnng davon.
Gruß
Petra

Hallo Sonia,

bitte formatiere den Text mit der Anweisung

 vor dem Versenden. Dann ist es auch viel lesbarer, und ich schaue es mir dann gerne an :smile:

Liebe Grüße

Sancho



> kann jemanden mir helfen?  
>   
> Vielen dank!  
>   
> Sonia

Hallo,

das klingt ein wenig, als wolltest du das Rad neu erfinden. Oracle kann so etwas selbst:

select name, vorname, row_number() over (partition by name, vorname order by vorname) from test;

Um damit die Tabelle zu updaten, bedienst du dich einfach der Row-ID und einer Schleife:

for xRec in (select rowid zeile, row_number() over (partition by name, vorname order by name) as wert from test) loop
update test set zaehler = xRec.wert where rowid = xRec.zeile;
end loop;

Man könnte das Select auch direkt im Update benutzen, aber dann wird’s schon arg unübersichtlich.

Viele Grüße
Ralf

Hallo Ralf,

ich danke dir vielmals für deine Antwort. Das war sehr hilfreich.

mfg
Sonia

Hallo!

Du machst es Dir sehr umständlich. Denke einfach ein bisschen kleiner. Darüber hinaus hast Du 2 Fehler im Skript:

  1. Eine Tabelle zu ändern, in der gerade die Bedingung für die Änderung gelesen wird, ist nur mit snapshots möglich bzw. nicht wirklich sinnvoll

  2. Ein count(*) zählt immer alle Datensätze einer Abfrage, daher bringt es Dir hier auch keinen Vorteil

Zum Konzept:

Zuerst machst Du Dir einen Cursor, der sortiert die Tabelle durchgräbt:

cursor c1
IS
SELECT lock_seq,name,vorname,zusatz
FROM test
order by name, vorname, lock_seq

An Variablen brauchst Du
i NUMBER:=1;
v_name CHAR(255):=’’;

Dann baust Du Dir eine Schleife, in der Du die Zeilen sequenziell durchgehst und den Name+Vorname mit der Variablen v_name vergleichst.
Schreibe i in das Feld zusatz,
Wenn gleich, dann
incrementiere i dann um 1
wenn ungleich, dann setze i auf 1
danach setze v_name auf den Wert von Name+Vorname

Das solltest Du mir einem R/W-Cursor auch direkt ohne ein Update machen können.

Viele Grüße

Burkhard

Hallo Sonia,

das Problem kannst Du direkt in SQl lösen, Du brauchst dazu nicht einmal eine eigene Spalte. Dazu gibt es bei Oracle die analytischen Funktionen. Im Web findest Du genügend Beispiele. Suche einmal nach „oracle analytic functions rank“

Viele Grüße

Wolfgang