pl/sql冒泡排序

pl/sql冒泡排序,sql,oracle,sorting,plsql,Sql,Oracle,Sorting,Plsql,好吧,我正在为此痛打自己。我需要加载存储在表中的人名数组。然后对姓氏进行排序,并按字母顺序打印出来。这必须使用气泡排序算法来完成 这是我到目前为止所拥有的 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;

好吧,我正在为此痛打自己。我需要加载存储在表中的人名数组。然后对姓氏进行排序,并按字母顺序打印出来。这必须使用气泡排序算法来完成

这是我到目前为止所拥有的

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
所有这一切真正做的就是打印出名字。我无法把它分类。我不想做这件事

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;

您通常希望在源查询中使用ORDER BY

不过,您也可以使用VARCHAR2索引by table进行排序

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;
/

这应该是你要找的。请注意,最好像示例中那样从表中键入变量/集合。我只是使用了泛型版本,因为我没有您的表可以使用。如果您不明白这是如何工作的,请随时询问。我猜这是一个家庭作业,其他人会在Oracle中进行冒泡排序,所以作业的重点是让你理解它,而不仅仅是让它正确

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;
/

您发布的第二段代码看起来像是冒泡排序算法的有效实现。它似乎不起作用的原因是因为最后一个循环。您不是打印已排序的数组,而是使用表中随机排序的数据重新填充它

因此,只需更改最后一个循环:

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

您还可以在此网站上使用PL/SQL中的冒泡排序示例:


为什么一定要用冒泡排序法?这是一个非常糟糕的家庭作业问题——要求你实施一些东西,如果你在现实世界中尝试这种方法,你会立即被释放,或者至少被送到再教育营:仍然没有!!请帮助我不是请求更多帮助的方式…这是一个很好的家庭作业问题。在作业中要求使用bubblesort的目的是让学生学习类似PL/SQL的循环和数组操作的更多细节。是的,ORDER BY是在现实生活中实现这一点的正确方法,但如果目标是精通PL/SQL,那么这并没有多大帮助。@Mark Bannister:没有。实现一个数组算法不仅仅是一次短暂的语言体验。学生们不必在每次需要创建过程时查找创建过程、声明变量和使用控制结构的语法,而是被迫坐下来实际学习PL/SQL。我的评论措辞不好,所以我更新了它。这是一个很好的解决方案,前提是这些值不是从SQL查询中检索到的!我在评论中添加了更多的信息,试图让你更清楚地知道你可能误入歧途了。。。再一次,如果你需要更多的澄清,请询问。谢谢克雷格,我会看看我是否能把我的澄清和你发布的一些想法结合起来。