2016-11-13 6 views
0

hallo mag ich die Daten an Brocken auf der Basis von Zeilen num aber im Versagen, wenn imAktualisierung auf der Basis von Zeilen num

declare 
temp varchar2(50); 
low varchar2(50); 
upp varchar2(50); 
begin 
low :=0; 

for i in (SELECT 
TO_CHAR(FLOOR(rownum/10) * 10) as low, TO_CHAR(FLOOR(rownum/10) * 10 + 10 -1) AS upp 
FROM emp 
GROUP BY FLOOR(rownum/10) 
ORDER BY FLOOR(rownum/10)) 
loop 


    update emp set thd=2  where rownum>i.low and rownum<i.upp; 
    commit; 
low:=low+1; 
    dbms_output.put_line(i.low|| i.upp); 


end loop; 
end; 

der Code aktualisiert die ersten 10 rec richtig zu aktualisieren versuchen, aber nicht aktualisieren die nächsten Zyklen 20-30 30-40

jedes erraten, warum

+0

Ist 'rownum' eine Spalte in Ihrer Tabelle' emp'? – FDavidov

+0

@FDavidov no its a psedo Spalte – fawad

+0

Ich weiß, dass Sie in PL/SQL ** die Zeilennummer in einer Auswahl erhalten können, was die _row-Nummer des Ergebnisses bedeutet. Ich bin nicht sicher, was die Bedeutung wäre, diese Zahl für ein Update zu verwenden (Raten, ich würde sagen ** keine **). – FDavidov

Antwort

0

in Oracle Pseudo rownum eine Zahl, die die Reihenfolge zurückgibt, in dem Oracle die Zeile aus einer Tabelle auswählt. Sie können verwenden wo rownum < n. Aber rownum > n wird immer leere Ergebnismenge zurückgeben. Weil die erste zurückgegebene Zeile immer rownum = 1 ist und Sie erwarten, dass es > n ist. Deshalb erhalten Sie kein Zeilenupdate. Documentation

Wenn Sie einige id in der Tabelle haben Sie das tun können:

merge into emp e 
using (select * from (select e2.*, row_number() over (order by id) r from emp e2) where r > 10 and r < 21) d 
on (e.id = d.id) 
when matched then update set thd = 2; 

Wenn Sie Sie können cursor for update keine ID haben verwenden.

+1

Er bekommt keinen Fehler - er bekommt gerade keine Zeilen mehr aktualisiert, da es keine Zeilen "wo rownum> 9" gibt. Dies erklärt, warum es nur eine Runde von Aktualisierungen gibt - "wo rownum> 0 und rownum <10" (oder was immer seine Berechnungen sind) in Ordnung ist, aber die anderen Male durch die Schleife werden keine Zeilen aktualisieren. – mathguy

+0

@mathguy Ja, du hast Recht. Ich habe über Fehler im Sinne von Logik nachgedacht. Ich werde meine Antwort ändern – Kacper

+0

@mathguy gibt es 20 Zeilen in meiner Tabelle so nach meinem Verständnis gibt es Zeilen größer mit rownum 9 – fawad

Verwandte Themen