Order registros salvos em tabela

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, boa noite pessoal....

Estou precisando criar um codigo, porem não estou conseguindo...

tenho uma tabela (codigo, nome, nr_ordem, data_cad)... vamos supor que tenho 50 registros e estão fora de ordem...

O campo NR_ORDEM é que determina a ordem de entrada dos processos, porém as vezes precisamos dar entrada num processo com data anterior, dai preciso REORDENAR A LISTA novamente.

Preciso ordenar os registros por DATA_CAD e CODIGO (order by DATA_CAD; CODIGO;)

Isso ordenado, eu faria um UPDATE na tabela, começando a numeração crescente, salvando no campo NR_ORDEM.

Dai cada registro teria seu nr de ordem.

Poderia fazer um select e alimentar um CONTADOR e nesse processo já salvar o contador no NR_ORDEM.

Selecionar tudo

UPDATE TAB_PROCESSOS SET NR_ORDEM = (contador + 1) where id_cidade = 5200605
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

me falaram pra fazer um tal curso plsql e atualizar... mas como fazer isso, esse é o problema
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

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

select * from tabela
order by data_cad, codigo;

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

select * from tabela order by data_cad, codigo

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
                  )
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Tópico movido para SQL !
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, rapaz, funcionou perfeitamente e esse ultimo exemplo q você passou, poucas linhas e com sucesso... muito obrigado

nesse codigo:

Selecionar tudo

UPDATE lic_licitacao Y
set Y.nr_ordem = (select ord
                  from (select t.rowid r, t.*, rank() over (partition by null order by data_autuacao, codigo) ord 
                        from lic_licitacao t 
                       ) x
                  where x.r = y.rowid
                  )
tem algum lugar nele q eu possa colocar um WHERE ? queria incluir esse codigo abaixo

Selecionar tudo

WHERE :g_id_cidade = 5200605 and
ANO_LICITACAO = :G_ANO AND CODIGO_MODALIDADE = :G_MODALIDADE order by
        DATA_AUTUACAO desc, CODIGO asc
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

corrigindo, desconsidere o ORDER BY q eu passei nessa código abaixo...

Selecionar tudo

WHERE :g_id_cidade = 5200605 and
ANO_LICITACAO = :G_ANO AND CODIGO_MODALIDADE = :G_MODALIDADE
Só preciso inserir esses 3 filtros, para filtrar registros específicos para dai fazer a ordenação, da forma que esta o código que foi passado, está ordenado todos os registros, sem critério.
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

ola,

consegui inserir condicoes para o filtro, porém a numeracao de ordem funciona, aparentemente perfeita nos itens q atendem a condição WHERE...

Mas os demais, que não atendem e que deviam ficar intactos, o campo NR_ORDEM é limpa, ou seja, ele numera dentro do criterio e apaga a ordem dos registros q não atendem ao criterio... o codigo ta assim:

Selecionar tudo

UPDATE lic_licitacao Y 
set Y.nr_ordem = (select ord
                  from (select t.rowid r, t.*, rank() over (partition by null order by data_autuacao, codigo) ord 
                        from lic_licitacao t where id_cidade = :g_id_cidade and ANO_LICITACAO = :G_ANO
                       ) x 
                  where x.r = y.rowid and id_cidade = :g_id_cidade and ANO_LICITACAO = :G_ANO
                  );
Adicionado no código inicial:

Selecionar tudo

  from lic_licitacao t where id_cidade = :g_id_cidade and ANO_LICITACAO = :G_ANO
                  where x.r = y.rowid and id_cidade = :g_id_cidade and ANO_LICITACAO = :G_ANO
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

ufaaaaa.... agora deu certo

vejam o codigo:

Selecionar tudo

UPDATE lic_licitacao Y 
set Y.nr_ordem = (select ord
                  from (select t.rowid r, t.*, rank() over (partition by null order by data_autuacao, codigo) ord 
                        from lic_licitacao t where id_cidade = :g_id_cidade and ANO_LICITACAO = :G_ANO
                       ) x 
                  where x.r = y.rowid and id_cidade = :g_id_cidade and ANO_LICITACAO = :G_ANO
                  ) where id_cidade = :g_id_cidade and ANO_LICITACAO = :G_ANO;

Caso alguém veja algo que possa dar errado, por favor me avise... rss

Agradeço a todos
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 17 visitantes