如何在一列的基础上对plsql集合进行排序

时间:2018-04-02 10:44:53

标签: oracle sorting plsql collections user-defined-types

我的嵌套集合类型是

NumGenus2 <- NumGenus[ grep(1, NumGenus$Number.in.Genus, invert = TRUE), ]

所以,有一个案例我正在使用循环中的值获取集合

TYPE Ty_Utils IS RECORD(
    Utils_Master  Ty_Util_Master,
    Utils_Details Ty_Tb_Utils_Details);

我必须按照Ty_Utils.utils_details(k).seq_no:=2 Ty_Utils.utils_details(k).seq_no:=3 Ty_Utils.utils_details(k).seq_no:=1 按升序对上述集合的所有值进行排序,即Ty_Utils.utils_details。部分seq_no将为null。我应该把它们放在最后。

请帮忙

1 个答案:

答案 0 :(得分:1)

这实际上取决于您的引用类型是如何创建的。如果Ty_Util_MasterTy_Tb_Utils_Details是SQL类型,那么您可以执行此操作。

您尚未提供大部分架构的任何详细信息,因此本演示中的所有对象都是猜测。参考类型:

create or replace type Ty_Util_Master as object (
    id number,
    txn_date date
);
/
create or replace type Ty_Utils_Detail as object (
    seq_no number,
    amt number,
    txn_type varchar2(3)
);
/
create or replace type Ty_Tb_Utils_Details as table of Ty_Utils_Detail;
/

示例包:

create or replace package tst as

    type  pl_Ty_Util is record (
        header  Ty_Util_Master
       , details Ty_Tb_Utils_Details
    );
    procedure process_utils  ( p_util in pl_Ty_Util);
end tst;    
/

create or replace package  body tst as

    procedure process_utils 
        ( p_util in pl_Ty_Util)
    is
    begin
        dbms_output.put_line('id = '||p_util.header.id);
        for idx in ( select t.* 
                     from table(p_util.details) t
                     order by t.seq_no nulls last)
        loop
             dbms_output.put_line('#'||idx.seq_no ||' '|| idx.amt ||' '|| idx.txn_type );
        end loop;
    end process_utils;
end tst;    
/

测试工具:

declare
    l_utils  tst.pl_Ty_Util;
begin
    l_utils :=  tst.pl_Ty_Util(Ty_Util_Master(42, sysdate)
                        , Ty_Tb_Utils_Details(
                             Ty_Utils_Detail(3, 3000, 'D')
                             , Ty_Utils_Detail(null, 275, 'C')
                             , Ty_Utils_Detail(1, 5000, 'C')
                             , Ty_Utils_Detail(4, 150, 'D')
                             , Ty_Utils_Detail(2, 2000, 'C')
                             )
                        );
     tst.process_utils(l_utils);       
end;
/

如果你想测试它here is a LiveSQL demo (free Oracle TechNet account required)