Vamos lá:
É possível fazer isso usando apenas um update! (sem cursor).
Mas é claro, também tem como fazer via cursor.
Vou criar uma tabela parecida com a sua:
Selecionar tudo
create table tabela as
select
sal nr_ordem
, hiredate data_cad
, empno codigo
from emp
Pronto. Essa é sua tabela:
Selecionar tudo
NR_ORDEM DATA_CAD CODIGO
--------- ----------- ------
800.00 17-Dec-80 7369
1600.00 20-Feb-81 7499
1250.00 22-Feb-81 7521
2975.00 02-Apr-81 7566
2850.00 01-May-81 7698
2450.00 09-Jun-81 7782
1500.00 08-Sep-81 7844
1250.00 28-Sep-81 7654
5000.00 17-Nov-81 7839
950.00 03-Dec-81 7900
3000.00 03-Dec-81 7902
1300.00 23-Jan-82 7934
3000.00 09-Dec-82 7788
1100.00 12-Jan-83 7876
14 rows selected
SQL>
Repare que o campo NR_ORDEM está bagunçado. (To ordenando pelo campo DATA_CAD e CODIGO como você falou).
Agora, vamos gerar a ordem certa! (vou mostrar como fazer SEM utilizar funções analíticas). Abaixo, a ordem correta é a pseudo-coluna ROWNUM!
Selecionar tudo
select a.*, rownum
from
(
select * from tabela
order by data_cad, codigo
) a
Selecionar tudo
NR_ORDEM DATA_CAD CODIGO ROWNUM
--------- ----------- ------ ----------
800.00 17-Dec-80 7369 1
1600.00 20-Feb-81 7499 2
1250.00 22-Feb-81 7521 3
2975.00 02-Apr-81 7566 4
2850.00 01-May-81 7698 5
2450.00 09-Jun-81 7782 6
1500.00 08-Sep-81 7844 7
1250.00 28-Sep-81 7654 8
5000.00 17-Nov-81 7839 9
950.00 03-Dec-81 7900 10
3000.00 03-Dec-81 7902 11
1300.00 23-Jan-82 7934 12
3000.00 09-Dec-82 7788 13
1100.00 12-Jan-83 7876 14
14 rows selected
SQL>
Agora, vamos ao UPDATE!
Selecionar tudo
UPDATE tabela Y
set Y.nr_ordem = (select ord
from (select rownum ord, rowid r
from
(
select * from tabela
order by data_cad, codigo
) a
) x
where x.r = y.rowid
)
E finalmente, como ficou nossa tabela:
Selecionar tudo
NR_ORDEM DATA_CAD CODIGO
--------- ----------- ------
1.00 17-Dec-80 7369
2.00 20-Feb-81 7499
3.00 22-Feb-81 7521
4.00 02-Apr-81 7566
5.00 01-May-81 7698
6.00 09-Jun-81 7782
7.00 08-Sep-81 7844
8.00 28-Sep-81 7654
9.00 17-Nov-81 7839
10.00 03-Dec-81 7900
11.00 03-Dec-81 7902
12.00 23-Jan-82 7934
13.00 09-Dec-82 7788
14.00 12-Jan-83 7876
14 rows selected
SQL>
Tem como fazer de forma mais facil? SIM. Usando funções analíticas. Facilita um pouco.
Assim: (mesmo resultado)
Selecionar tudo
UPDATE tabela Y
set Y.nr_ordem = (select ord
from (select t.rowid r, t.*, rank() over (partition by null order by data_cad, codigo) ord
from tabela t
) x
where x.r = y.rowid
)