2

我想通过在 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 回答 4

4

使用 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;
于 2019-06-11T13:34:27.193 回答
3

要对集合进行排序,您需要在模式级别定义类型。

CREATE TYPE num_asc IS TABLE OF NUMBER;

您可以在带有ORDER BY子句的 select 语句中使用它。

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;

归功于 Lucas Jellema,他发表了几篇关于这个主题的文章。

于 2019-06-11T12:30:02.593 回答
2

可以在不收集的情况下对列表进行排序 - 肯定有很多。无论如何,您可以对其进行编程。例如,以 CSV 字符串开头的仅 SQL 解决方案:

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;
于 2019-06-11T17:15:28.653 回答
1

由于您使用的是 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

祝你好运。

于 2019-06-11T12:37:16.687 回答