2010-11-04 8 views
3

ok, je me bats là-dessus. Je dois charger un tableau dans le nom de famille de personnes stocké dans une table. Triez ensuite les noms de famille et imprimez-les par ordre alphabétique. Cela doit être fait en utilisant l'algorithme de tri à bulles.pl/sql bubble tri

voici ce que j'ai jusqu'à présent

CREATE OR REPLACE PROCEDURE TEAM_TABLE_SORT AS 
    TYPE player_Name_type IS TABLE OF databasename.team.player%type 
    INDEX BY PLS_INTEGER ; 
    player_name player_Name_type; 
    i integer := 1; 
    temp integer; 

BEGIN 

    FOR player_names IN (SELECT * FROM marshall.team) 
    LOOP 
    player_name(i) := player_names.player; 
    DBMS_OUTPUT.PUT_LINE(i|| ' - ' ||chr(9) || player_name(i)) ; 
    i := i + 1 ; 
    END LOOP 

Tout cela fait vraiment est d'imprimer les noms. Je n'arrive pas à le trier. Je ne suis pas essayer chose cela

TYPE player_Name_type IS TABLE OF %type INDEX BY varchar2(20) ; 
aux player_Name_type; 
i integer := 1; 
v_current is table of aux 
swapped BOOLEAN := TRUE; 

BEGIN 

    FOR aux IN (SELECT * FROM) 
    LOOP 
    DBMS_OUTPUT.PUT_LINE(i|| ' - ' ||chr(9) || aux.player); 
    i := i + 1 ; 
    END LOOP; 

    v_current := aux.first; 
    WHILE(swapped) 
    LOOP 
    swapped := FALSE; 

    FOR I IN 1..(aux.count-2) LOOP 
     IF aux(i) > aux(I+1) THEN 
     v_current := aux(i+1); 
     aux(I+1) := aux(i); 
     aux(i) := v_current; 
     END IF; 
     swapped := TRUE; 

    END LOOP; 

    END LOOP; 

FOR aux IN (SELECT * FROM LOOP 

    DBMS_OUTPUT.PUT_LINE(i|| ' - ' ||chr(9) ||aux.player); 
    i := i + 1 ; 
END LOOP; 
+3

'ORDER BY lastname' =) –

+0

Pourquoi devez-vous utiliser le tri à bulles? –

+6

Ceci est une très mauvaise question de devoirs - vous obligeant à mettre en œuvre quelque chose qui, si vous deviez l'essayer dans le monde réel, vous seriez immédiatement "lâché" (ou au moins envoyé au camp de rééducation) :) –

Répondre

7

Ceci devrait être ce que vous cherchez. Notez qu'il est préférable de taper les variables/collections des tables comme dans votre exemple. Je viens d'utiliser des versions génériques car je n'ai pas vos tables pour travailler avec. Si vous ne comprenez pas comment cela fonctionne, n'hésitez pas à demander. Je devine que c'est devoirs (qui d'autre pourrait faire le tri dans Oracle), donc le but de la mission est pour vous de le comprendre, pas seulement pour le faire correctement. :)

DECLARE 
    coll DBMS_SQL.VARCHAR2A; 
    swapped BOOLEAN; 
    tmp  VARCHAR2(10); 
BEGIN 
    /* 
    Generate 10 random strings and collect them into our collection 
    Note: you would replace this with your query on marshall.team 
    */ 
    select dbms_random.string('l',10) rand_string 
    BULK COLLECT INTO coll 
    from dual 
    connect by level <= 10; 


    /* 
    At this point, all of the rows we need are in our collection 
    so there is no need to go back to the table anymore. Now onto the... 

    Bubble sort.. walk through the collection swapping elements until 
    we make a pass where no swapping takes place 
    */ 
    LOOP 

    swapped := false; 

    FOR i IN 2 .. coll.LAST 
    LOOP 

    IF coll(i-1) > coll(i) 
    THEN 
     -- swap records 
     tmp := coll(i); 
     coll(i) := coll(i-1); 
     coll(i-1) := tmp; 

     /* 
     Mark that swap has taken place. note we mark as true only inside 
     the if block, meaning a swap really did take place 
     */ 
     swapped := true; 

     END IF; 

    END LOOP; 

    -- If we passed through table without swapping we are done, so exit 
    EXIT WHEN NOT swapped; 

    END LOOP; 

    /* 
    Now print out records to make sure they are in order. Again notice 
    how we are just referencing the (now sorted) collection and not going 
    back to the table again 
    */ 
    FOR i in coll.FIRST .. coll.LAST 
    LOOP 

    dbms_output.put_line(coll(i)); 

    END LOOP; 

END; 
/
+2

correction: qui d'autre implémenterait * any * sort dans Oracle ... –

+0

J'ai ajouté quelques informations supplémentaires dans les commentaires pour essayer de rendre plus clair où vous pourriez avoir été égaré ... Encore une fois, si vous avez besoin de plus de clarification, s'il vous plaît demander. – Craig

+0

Merci craig, je vais voir si je peux prendre le mien et le faire fonctionner avec certaines des idées que vous avez postées. – user496698

2

Vous souhaitez généralement utiliser un ORDER BY dans la requête source.

Vous pouvez également utiliser une table d'indexation VARCHAR2 pour effectuer le tri.

DECLARE 
    CURSOR c_1 is 
    SELECT table_name, num_rows FROM user_tables order by num_rows; 
    TYPE typ_tab IS TABLE OF c_1%rowtype INDEX BY user_tables.table_name%type; 
    t_tab typ_tab; 
    v_str user_tables.table_name%type; 
BEGIN 
    FOR c_rec IN c_1 LOOP 
    t_tab(c_rec.table_name) := c_rec; 
    END LOOP; 
    v_str := t_tab.first; 
    WHILE v_str IS NOT NULL LOOP 
    dbms_output.put_line(t_tab(v_str).table_name||':'||t_tab(v_str).num_rows); 
    v_str := t_tab.next(v_str); 
    END LOOP; 
END; 
/
+0

C'est une bonne solution, à condition que les valeurs ne soient * pas * extraites d'une requête SQL! –

1

Le deuxième morceau de code que vous avez affiché ressemble à une mise en œuvre valide de l'algorithme de tri à bulles. La raison pour laquelle il semble ne pas fonctionner est à cause de cette boucle finale. Au lieu d'imprimer le tableau trié, vous le repeuplerez avec des données aléatoires de votre table.

Ainsi, il suffit de changer la boucle finale:

FOR i IN 1..aux.count() 
LOOP  
    DBMS_OUTPUT.PUT_LINE(i|| ' - ' ||chr(9) ||aux(i).player); 
END LOOP;