Как отсортировать таблицу чисел в PL / SQL? - PullRequest
2 голосов
/ 11 июня 2019

Я хочу отображать числа в порядке возрастания, используя коллекции в plsql.

У меня есть код, как показано ниже.Это будет отображать числа в несортированном порядке, но я хочу отображать их в отсортированном порядке

DECLARE
    TYPE num_asc IS
        TABLE OF NUMBER;
    rec_num   num_asc;
    v_var     NUMBER;
BEGIN
    rec_num := num_asc(10,21,13,14,52,16);
    FOR i IN rec_num.first..rec_num.last LOOP
        dbms_output.put_line (rec_num (i));
    END LOOP;
END;
Required result:  
10  
13  
14  
16  
21  
52

Ответы [ 4 ]

4 голосов
/ 11 июня 2019

Использовать SQL. Это, конечно, наименьший код и, возможно, самый эффективный подход. Просто измените тип коллекции на то, что мы можем использовать в функции table():

DECLARE
    rec_num  sys.odcinumberlist;
BEGIN
    rec_num := sys.odcinumberlist(10,21,13,14,52,16);
    for i in (select * from table(rec_num) order by 1)
    loop
        dbms_output.put_line(i.column_value);
    end loop;
END;
3 голосов
/ 11 июня 2019

Чтобы отсортировать коллекцию, вам нужно определить тип на уровне схемы.

CREATE TYPE num_asc IS TABLE OF NUMBER;

Вы можете использовать его в операторе выбора с предложением ORDER BY.

DECLARE
    rec_num   num_asc;
    v_var     NUMBER;
BEGIN
    rec_num := num_asc(10, 21, 13, 14, 52, 16);

    --Sorting rec_num
    SELECT CAST (MULTISET (
        SELECT *
          FROM TABLE (rec_num)
         ORDER BY 1
    ) AS num_asc)
      INTO rec_num
      FROM dual;
    FOR i IN rec_num.first..rec_num.last LOOP
        dbms_output.put_line (rec_num (i));
    END LOOP;
END;

Благодарность принадлежит Лукасу Джеллеме, который опубликовал пару статей на эту тему.

2 голосов
/ 11 июня 2019

Можно ли отсортировать список без коллекции - конечно, их много.Во всяком случае, вы можете запрограммировать его.Например, решение только для SQL, начинающееся со строки CSV:

with num_list as (select '10, 21, 13, 14, 52, 16' val from dual )
select v
  from 
      ( select trim(regexp_substr(val,'[^,]+', 1, level)) v 
          from num_list
          connect by trim(regexp_substr(val,'[^,]+', 1, level)) is not null
       )
order by v;
1 голос
/ 11 июня 2019

Поскольку вы используете коллекцию PL / SQL, вы можете просто написать небольшую процедуру для их сортировки:

DECLARE
  TYPE num_asc IS TABLE OF NUMBER; 

  rec_num  num_asc;
  v_var    number;

  PROCEDURE sort_numbers(pioNumbers IN OUT num_asc) IS
    bSwapped  BOOLEAN := FALSE;
    bRepeat   BOOLEAN := TRUE;
    nTemp     NUMBER;
  BEGIN
    WHILE bRepeat LOOP
      FOR i IN 1..pioNumbers.COUNT-1 LOOP
        IF pioNumbers(i+1) < pioNumbers(i) THEN
          nTemp := pioNumbers(i);
          pioNumbers(i) := pioNumbers(i+1);
          pioNumbers(i+1) := nTemp;
          bSwapped := TRUE;
        END IF;
      END LOOP;  -- i

      bRepeat := bSwapped;
      bSwapped := FALSE;
    END LOOP;  -- bRepeat
  END sort_numbers;

  PROCEDURE print_numbers(pinMsg     IN VARCHAR2,
                          pinNumbers IN num_asc) IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE(pinMsg);

    for i in pinNumbers.first .. pinNumbers.last loop
      dbms_output.put_line(pinNumbers(i));
    end loop;
  END print_numbers;
BEGIN
  rec_num := num_asc(10,21,13,14,52,16);

  print_numbers('Before sort', rec_num);

  sort_numbers(rec_num);

  print_numbers('After sort', rec_num);
END;

, который выдает следующий вывод:

Before sort
10
21
13
14
52
16
After sort
10
13
14
16
21
52

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...