Só pra constar, citarei também que PL/SQL ** implica ** que vc está usando banco de dados, e (naturalmente) bancos de dados JÁ POSSUEM rotina de sort interna muito eficiente, poderia-se simplesmente se fazer um select da pl/sql table, como o mostrado abaixo : eu nunca usei isso (já que sempre trabalho com volumes GRANDES, que inviabilizam totalmente uso de arrays, sempre usei global temporary tables pra coisas do tipo), mas fica a dica pra ser objeto de testes.
[]s Chiappa ====================================================================== ====================== I'll show you how to use SQL to sort the table in 7.x and another, easier way in 8.x. First the 7.x way. You can use the 'call plsql from sql' feature to make your plsql an in memory SQL table as follows: SQL> create or replace package demo_sort 2 as 3 type myArray is table of varchar2(30) index by binary_integer; 4 4 function get_array_element( p_index in number ) return varchar2; 5 pragma restrict_references( get_array_element, WNDS, RNDS, WNPS ); 6 6 function get_array_count return number; 7 pragma restrict_references( get_array_count, WNDS, RNDS, WNPS ); 8 8 procedure do_demo; 9 9 pragma restrict_references( demo_sort, wnds, rnds, wnps, rnps ); 10 end; 11 / Package created. SQL> create or replace view my_demo_view 2 as 3 select demo_sort.get_array_element(rownum) data 4 from all_objects 5 where rownum <= ( select demo_sort.get_array_count from dual ) 6 / View created. so, the view based on a 'big' table (all_objects) can now be used to index into your plsql table in the demo_sort package by calling the function get_array_element. We provided a function get_array_count to let this view know when to 'stop' calling get_array_element.... SQL> create or replace package body demo_sort 2 as 3 3 3 g_my_plsql_table myArray; 4 g_my_count number := 0; 5 5 function get_array_element( p_index in number ) return varchar2 6 is 7 begin 8 return g_my_plsql_table(p_index); 9 end; 10 10 function get_array_count return number 11 is 12 begin 13 return g_my_count; 14 end; 15 15 15 procedure do_demo 16 is 17 begin 18 for x in ( select username from all_users where rownum < 10 ) 19 loop 20 g_my_plsql_table( g_my_count+1 ) := x.username; 21 g_my_count := g_my_count+1; 22 end loop; 23 23 for x in ( select data from my_demo_view order by data ) 24 loop 25 dbms_output.put_line( x.data ); 26 end loop; 27 end; 28 28 end; 29 / Package body created. Now, we can see it at work. the select on the view selects from the plsql table -- we can sort it, we can where on it, we could use it in an IN statement and so on... SQL> exec demo_sort.do_demo DBSNMP SYS SYSTEM TRACESVR WEB$GBRADSHA WEB$GDEYOUNG WEB$JBROTHER WEB$KKISER WEB$RPPRASAD PL/SQL procedure successfully completed. Now, if I had Oracle8, i might use the following, easier way: SQL> create or replace type myTableType as table of varchar2(25); 2 / Type created. SQL> SQL> declare 2 l_x myTableType := myTableType(); 3 3 begin 4 for x in ( select username from all_users where rownum < 10 ) 5 loop 6 l_x.extend; 7 l_x(l_x.count) := x.username; 8 end loop; 9 9 for x in ( select a.column_value data 10 from THE ( select cast( l_x as mytableType ) from dual ) a 11 order by data ) 12 loop 13 dbms_output.put_line( x.data ); 14 end loop; 15 15 end; 16 / DBSNMP SYS SYSTEM TRACESVR WEB$GBRADSHA WEB$GDEYOUNG WEB$JBROTHER WEB$KKISER WEB$RPPRASAD PL/SQL procedure successfully completed. --- Em [email protected], "Ederson" <[EMAIL PROTECTED]> escreveu > > Fábio, > > Abaixo, um link com vários algoritmos de ordenação para vc implementar. > > Estão em Pascal, mas é facílimo de entender. > > http://www.pascaltotal.hpg.ig.com.br/avancado/ordenacao.htm > > O mais rápido é o HeapSort, é um tanto difícil de entender, mas funciona. > > Outro rápido, eficiente e fácil de entender é o QuickSort > > Bom uso > > > Ederson > > -----Mensagem original----- > De: [email protected] [mailto:[EMAIL PROTECTED] Em > nome de Fabio Quirino > Enviada em: terça-feira, 21 de fevereiro de 2006 15:49 > Para: [email protected] > Assunto: [oracle_br] Metodo de ordenacao em PL/SQL > > Galera, > > Criei um procedimento que ordena um determinado vetor utilizando o método > bolha, entretanto, esse método é muito lento quando se possui um grande > número de linhas num vetor. > Sei que existem outros métodos de ordenação mais eficientes, entretanto > não estou conseguindo encontrar na internet, alguém poderia dar uma ajuda > enviando um exemplo, ou até mesmo um link como referência? > Abaixo segue o procedimento que uso para ordenação. > -- > procedure P_ORDENA_PRODUTO is > aux varchar2(14); > begin > for x in 1..vetproduto.count loop > for y in 1..vetproduto.count - x loop > if vetproduto(y + 1).cod_produto < vetproduto (y).cod_produto then > prod_aux := > vetproduto(y).cod_produto; > vetproduto(y).cod_produto := vetproduto(y + > 1).cod_produto; > vetproduto(y + 1).cod_produto := prod_aux; > end if; > end loop; > end loop; > end; > > > Fabio Quirino > MSN: [EMAIL PROTECTED] > ICQ: 147482462 > -------------------------------------------------------------------------------------------------------------------------- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/[email protected]/ --------------------------------------------------------------------------------------------------------------------------__________________________________________________________________ Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html
