我希望使用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;
所需成绩: 10 13 14 16 21 52
发布于 2019-06-11 05:34:27
使用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-11 04:30:02
要对集合进行排序,需要在架构级别上定义类型。
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;
这要归功于卢卡斯·杰勒马,他发表了几篇关于这一主题的文章。
发布于 2019-06-11 04:37:16
由于您使用的是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
祝你好运。
https://stackoverflow.com/questions/56543514
复制