【Oracle】在PL/SQL中使用sql实现插入排序

发布时间 2023-07-15 15:06:20作者: DbWong_0918

【Oracle】在PL/SQL中使用sql实现插入排序

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

不一般来说,就是瞎搞,正好也可以巩固自己的数据结构基础,主要也发现没有人用SQL去实现这些算法(小声bb)

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

以下是正文:

规范:

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

体:

create or replace package body data_structure_pkg is
  --------------------以下为排序部分----------------------
  --定义一个存储数据的临时表
  type numtable2 is table of long index by binary_integer;
  ---------------------------------
  --插入排序主方法
  procedure charu_get_data(p_data varchar2) is
    v_data      numtable2;
    n           number := 1;
    j           number;
    p_tmp       varchar2(50);
  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 2 .. v_data.count loop
      --记录要插入的数据
      p_tmp := v_data(i);
      --从已排序头开始
      j := i;
      --从已经排序的序列的开始比较
      --需要注意,在java或者c中,下标的开头是0
      --但是在数据库表中,是1开头的,如果沿用java的数组从0开始则会导致not data found错误
      while j > 1 and p_tmp < nvl(v_data(j - 1),v_data(1)) loop
        v_data(j) := v_data(j - 1);
        j := j - 1;
      end loop;
      --如果找到比其小的数,替换
      if j != i then
        v_data(j) := p_tmp;
      end if;
    end loop;
    --打印出来排序以后的数据
    for z in 1 .. v_data.count loop
      dbms_output.put_line('排序后第' || z || '位:' || v_data(z) || '|');
    end loop;

  end charu_get_data;

end data_structure_pkg;

输入数据

2;3;1;4;6;5;8;7

得到结果

image