Ordenando uma PL Table
[ad#texto]
Em vários casos precisamos lançar mão das famosas PL Table no Oracle, os motivos são diversos, e em vários casos não é possível ordená-las no momento da gravação de dados, vamos então ver como ordenar uma PL Table utilizando alguns recursos interessantes do PL/SQL.
Este caso de uso irá precisar de um Type físico, ou seja, um Type registrado diretamente no banco de dados, um Type registrado somente na sua aplicação PL/SQL (lógico) não irá funcionar.
Primeiro criamos o Type no Oracle:
create or replace type meuTipo as table of varchar2(25);
Em seguida já aplicamos a lógica para criar os dados e ordena-los na sequência:
declare
tipoCR meuTipo := meuTipo();
begin
for dados in ( select username from all_users where rownum < 100 ) loop
tipoCR.extend;
tipoCR(tipoCR.count) := dados.username;
end loop;
for dados in ( select ta.column_value nomes from THE ( select cast( tipoCR as meuTipo ) from dual ) ta order by nomes ) loop
dbms_output.put_line( dados.data );
end loop;
end;
O que o código PL/SQL acima fez?
Ele primeiro instanciou o meu Type criado anteriormente (meuTipo), feito isso ele fez um SELECT na tabela ALL_USERS e foi atribuindo de forma não ordenada, após a PL Table populada ele utilizando um SELECT no próprio Type fez a ordenação, note a flexibilidade desta solução, foi feito um ORDER BY direto na PL TABLE dentro de um laço FOR, se fosse necessário seria também possível utilizar uma cláusula WHERE.
Como o exemplo utiliza os próprios recursos do Oracle para realizar o SORT ele tende a ser veloz e eficiente.