Oracle 需要对存储过程中的随机数列表进行排序

Oracle 需要对存储过程中的随机数列表进行排序,oracle,plsql,oracle11g,bubble-sort,Oracle,Plsql,Oracle11g,Bubble Sort,我需要帮助创建一个存储过程,允许用户输入一个随机数列表,然后使用冒泡排序算法对其进行排序。我对编程和PL/SQL非常陌生。任何帮助都将不胜感激 以下是我迄今为止的代码行: CREATE OR REPLACE PROCEDURE test_BubbleSort (i_number IN number) AS type l_array_type IS TABLE OF NUMBER(10); l_temp NUMBER; l_array l_array_type := l_array_typ

我需要帮助创建一个存储过程,允许用户输入一个随机数列表,然后使用冒泡排序算法对其进行排序。我对编程和PL/SQL非常陌生。任何帮助都将不胜感激

以下是我迄今为止的代码行:

CREATE OR REPLACE PROCEDURE test_BubbleSort (i_number IN number) AS

type l_array_type IS TABLE OF NUMBER(10);

l_temp  NUMBER;

l_array l_array_type := l_array_type();

BEGIN

  --Loop through numbers and re-arrange their order using bubble sort---

  FOR i in 1 .. l_array.Count - 1 LOOP

    FOR j IN 2 .. l_array.Count LOOP
      IF l_array(j) > l_array(j - 1) THEN
        l_temp := l_array(j - 1);
        l_array(j - 1) := l_array(j);
        l_array(j) := l_temp;
      END IF;
    END LOOP;
  END LOOP;

  --Print the newly sorted numbers user inputs 

  FOR i in REVERSE 1 .. l_array.COUNT LOOP

    dbms_output.put_line('The new sorted numbers are: ' || l_array(i));
  END LOOP;

END;

我不认为这是您真正想要的,但如果您确实希望自己生成随机数,并且只希望用户提供列表的长度作为I_编号,那么您可以循环执行该操作:

...
BEGIN

  --Generate some random numbers
  for i in 1..i_number loop
    l_array.extend;
    l_array(i) := dbms_random.value(1, 100);
  end loop;

  --Loop through numbers and re-arrange their order using bubble sort---

  FOR i in 1 .. l_array.Count - 1 LOOP
  ...
使用i_number参数值5调用时,可能会给出:

The new sorted numbers are: 10
The new sorted numbers are: 55
The new sorted numbers are: 60
The new sorted numbers are: 74
The new sorted numbers are: 87

dbms_random.value调用的参数限制了生成的“随机”数的范围。

这是我最后得出的答案。只是想和大家分享一下

CREATE OR REPLACE PROCEDURE test_BubbleSort1(i_number IN VARCHAR2)
IS
  --Local variables
  l_temp NUMBER;
  type l_array_type IS TABLE OF NUMBER(10);
  l_array l_array_type;
BEGIN
  --Parse values and dump into collections
  SELECT TRIM(SUBSTR(txt,
                 INSTR(txt, ',', 1, level) + 1,
                 INSTR(txt, ',', 1, level + 1) -
                 INSTR(txt, ',', 1, level) - 1)) BULK COLLECT
  INTO l_array
  FROM (select ',' || i_number || ',' AS txt FROM DUAL)
  CONNECT BY LEVEL <= LENGTH(i_number) - LENGTH(replace(i_number, ',', '')) + 1;

  --Loop through numbers and re-arrange their order using bubble sort
  FOR i in 1 .. l_array.LAST - 1
  LOOP
    FOR j IN 2 .. l_array.LAST
    LOOP
      IF l_array(j) > l_array(j - 1) THEN
        l_temp := l_array(j - 1);
        l_array(j - 1) := l_array(j);
        l_array(j) := l_temp;
      END IF;
    END LOOP;
  END LOOP;
  --Print the newly sorted numbers
  FOR k IN reverse 1 .. l_array.LAST
  LOOP
    DBMS_OUTPUT.PUT_LINE('The new sorted numbers are: ' || l_array(k));
  END Loop;
END;

你的代码没有做什么?你会犯什么错误?您预期的输入和输出是什么?我预期的输入将由用户定义。因此,用户将插入一些随机数,并且输出需要是使用用户输入的气泡排序算法对这些随机数进行排序的列表。这有帮助吗?您的过程是将单个数字作为参数,然后您就不会引用它了。l_数组是如何填充的?目前,这没有任何作用,因为没有要排序或显示的内容。如果你用随机数填充l_数组,那么它会对它们进行排序,所以这似乎是缺少的部分。您的代码在哪里失败?返回的是错误数据还是错误数据,也没有排序?如果你使用张贴一些样本,那么你会得到一些答案。如果用户输入它们,它们不是真正随机的。。。8-PL/SQL并不是真正为用户交互而设计的,所以这对我来说没有什么意义。您可以很容易地生成i_编号随机数,然后对它们进行排序,但是对于用户来说,您需要为调用提供那么多参数,或者依赖于客户端的行为,例如在运行时提示替换变量。我认为这目前可以用。这似乎非常接近我想要实现的目标。但是,我也会继续寻找替代方案。谢谢你的帮助!谢谢你抽出时间。