【Oracle】在PL/SQL中使用sql实现选择排序

【Oracle】在PL/SQL中使用sql实现选择排序

一般来说,SQL要排序的话直接使用order by即可

不一般来说,就是瞎搞,正好也可以巩固自己的数据结构基础

使用SQL实现排序系列:
使用SQL实现冒泡排序

以下是正文:

规范:

create or replace package data_structure_pkg is
  procedure xuanze_get_data(p_data varchar2);
end data_structure_pkg;

体:

create or replace package body data_structure_pkg is
  --------------------以下为排序部分----------------------
  --定义一个存储数据的临时表
  type numtable1 is table of long index by binary_integer;
  ---------------------------------
  --选择排序主方法
  procedure xuanze_get_data(p_data varchar2) is
    v_data numtable1;
    n      number := 1;
    p_num  number;
    p_min  number;
  begin
    --以;作为分隔符,将数字进行分离
    for sub_data in (select tt.data as sdata
                       from (select regexp_substr(p_data, '[^;]+', 1, level) data
                               from dual bd
                             connect by level <=
                                        regexp_count(p_data, ';') + 1) tt
                      where rownum <= regexp_count(p_data, ';') + 1) loop
      --放入临时表
      v_data(n) := sub_data.sdata;
      --打印出来原顺序的数据
      dbms_output.put_line('排序前第' || n || '位:' || v_data(n) || '|');
      --递增
      n := n + 1;
    end loop;
    dbms_output.put_line('-------------------------------------');
    /********
    首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
    再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
    *********/
    --排序
    for i in 1 .. v_data.count loop
      p_min := i;
      --依次提取i次下标位数字
      for j in (i + 1) .. v_data.count loop
        if to_number(v_data(j)) < to_number(v_data(p_min)) then
          --记录目前能找到的最小值元素的下标
          p_min := j;
        end if;
      end loop;
      --将找到的最小值和i位置所在的值进行交换
      if i != p_min then
        p_num := to_number(v_data(i));
        v_data(i) := v_data(p_min);
        v_data(p_min) := p_num;
      end if;
    end loop;
    --打印出来排序以后的数据
    for z in 1 .. v_data.count loop
      dbms_output.put_line('排序后第' || z || '位:' || v_data(z) || '|');
    end loop;
  end xuanze_get_data;

end data_structure_pkg;

输入数据

2;34;1;5;9;8;6;13;25;24;56

得到结果

image

posted @ 2023-07-08 15:43  DbWong_0918  阅读(205)  评论(0编辑  收藏  举报