Order by Dinâmico

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
marlonpasquali
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 248
Registrado em: Sex, 06 Fev 2009 3:02 pm
Localização: ERECHIM - RS

Olá Pessoal,

Tenho um cursor dentro de um PL/SQL e gostaria de através de parametros que o usuário pudesse escolher a forma de ordenação desta query. Por exemplo neste caso, que ele pudesse escolher se quer por ordem de Código do Produto ou por sua Descrição.

Tem como fazer isso ?

Selecionar tudo

cursor c_produtos is 
SELECT  msi.segment1    codigo,
             msi.description  descricao
   FROM mtl_item_categories   mic,
            mtl_category_sets      mcs,
            mtl_categories           mc,
            mtl_system_items      msi
WHERE msi.organization_id    = 104
     AND msi.inventory_item_id  = mic.inventory_item_id
     AND msi.organization_id    = mic.organization_id
     AND mic.category_set_id    = mcs.category_set_id
     AND mcs.structure_id       = mc.structure_id
     AND mic.category_id        = mc.category_id
     AND mcs.category_set_name  = 'Compras'
 ORDER BY 1;
Obrigado,
Marlon
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Você pode utilizar um decode no "order by" utilizando um parâmetro de verificação do tipo de ordenação.
Depois retornar o campo desejado. O Importante é que os campo do decode DEVEM ser do mesmo tipo de dado, ou tudo NUMBER ou VARCHAR e etc...

Selecionar tudo

order by DECODE(&p_ordem,'COD',msi.segment1,msi.description)
marlonpasquali
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 248
Registrado em: Sex, 06 Fev 2009 3:02 pm
Localização: ERECHIM - RS

Ótimo. Funcionou.
Muito obrigado !
abraço !
Marlon
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Quanto ao ODER BY dinâmico, não sabia que poderíamos utilizar o DECODE juntamente com a clausula ORDER BY, achei interessante.

Mas gostaria de aproveitar o tópico para levantar uma dúvida. Dependendo de como a estrutura da tabela estiver definida, pela quantidade de registros retornados, capacidade de hardware, número de conexões simultânea, este tipo de recurso é usual, aplicável e prático?! Pois sabemos que o ORDER BY por si só e por ter a função de classificação dos dados já é muito custoso para o banco.

Por isso, questiono, é viável? Para mim, o mais correto seria tratar isso na aplicação através de um dataset e trabalhar com os dados em cache, pois é uma facilidade de visualização para o usuário o que de certa forma não deveria impactar no banco consumindo seus recursos. O que uma hora ou outra vai resultar em rede congestionada, objeto lockado, aplicação travando e usuário reclamando.

Não é de se pensar? Ou estou enganado?

Att.,
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Concordo com você que deve-se analisar esta situação. Acredito que tudo DEPENDE da situação. Não existe uma formula única que seja a melhor solução para todos casos.
Num banco em estado "normal", o custo do "order by" é mísero pois a ordenação já feita na montagem/seleção dos dados de forma otimizada pelo banco. Já um DISTINCT é mais pesado dependendo dos dados e quantidade.
Ao passar passar por um dataset, é adicionado 1 passo a mais no processo, que é justamente atribuir o resultado a ele. O que inclui nisto o "tempo de conversa" do banco com a aplicação, da rede, etc... Depois existe a ordenação do dataset na aplicação, que é diferente da do banco. Onde o servidor de aplicação também pode estar congestionado.
Enfim, existem diversos fatores que podem influenciar o desempenho. Se trabalhar com dataset e a vantagem de seus recursos é prioridade, então ótimo. Acredito que vai depender do caso e da prioridade.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Minha opinião, se o order by for realmente necessário, o melhor lugar para fazer o ordenamento é no próprio banco.

Fazer na aplicação significa que você terá que trazer dados fora de ordem, o que implica trazer mais linhas do que estritamente necessário; por sua vez consumindo mais recursos do banco com I/O, CPU no processamento e banda de rede trafegando dados ainda não prontos para serem consumidos. Além de exigir do servidor de aplicação que massageie um pouco mais os dados numa etapa posterior.

Por outro lado, acontece muitas vezes e vemos por aí todo dia, de selects que fazem order by sem motivo funcional. Isso sim caracteriza recursos desperdiçados.
Responder
  • Informação