【问题标题】:Oracle - object order - how does it work?Oracle - 对象顺序 - 它是如何工作的?
【发布时间】:2019-05-31 18:17:26
【问题描述】:

Oracle 文档如下所述:“与 map 方法一样,如果定义了一个 order 方法,则在需要比较该类型的两个对象时自动调用该方法。”

所以我假设它会在使用“order by”分句时进行排序。

可以说,我有以下对象:

create or replace type height as object
(
    val number,

    constructor function height return self as result,
    constructor function height (val number) return self as result,

    order member function compare (other height) RETURN INTEGER 
);

及其主体实现:

create or replace type body height is
    constructor function height return self as result is
         begin
            self.val := null;
         end;

    constructor function height (val number) return self as result is
         begin
            self.val := val;
            return;
         end; 

    order member function compare (other height) return integer is
        begin
            if self.val > self.val then return 1;
            elsif self.val < self.val then return -1;
            else return 0;
            end if;
        end;
end;

那么我的表是这样的:

CREATE TABLE people (
    name varchar2(50),
    height height
);

还有一些记录...

insert into people values ('Foo', height(150));
insert into people values ('Bar', height(130));
insert into people valueS ('Baz', height(180));

那我要排序:

select p.height.val from people p order by height ASC;
select p.height.val from people p order by height DESC;

但无论顺序是 asc 还是 desc,2 个查询的结果都是一样的。

【问题讨论】:

    标签: sql oracle user-defined-types


    【解决方案1】:

    我试验了您的代码并找到了解决方案。

    可行的解决方案如下所示

    我添加了第二个带有两个参数的比较函数

    create or replace type height as object
    (
        val number,
    
        constructor function height return self as result,
        constructor function height (val number) return self as result,
    
        order member function compare2 (other height) return integer,
        member function compare (o1 height,o2 height) return integer
    );
    /
    
    create or replace type body height is
        constructor function height return self as result is
             begin
                self.val := null;
             end;
    
        constructor function height (val number) return self as result is
             begin
                self.val := val;
                return;
             end; 
    
        order member function compare2 (other height) return integer is
           begin
                RETURN compare(SELF,other);
            end;
         member function compare (o1 height,o2 height) return integer is
            begin
              if o1.val > o2.val then return 1;
                elsif o1.val < o2.val then return -1;
                else return 0;
                end if;
            end;    
    
    end;
    /
    
    select p.height.val from people p order by height ASC;
    
    |高度值 | | ---------: | | 130 | | 150 | | 180 |
    select p.height.val from people p order by height DESC;
    
    |高度值 | | ---------: | | 180 | | 150 | | 130 |

    db小提琴here

    【讨论】:

    • 感谢您的回答,它帮助我找出了我的代码出了什么问题...原来在比较函数中我将 self 与 self 进行了比较...(如果 self.val > self .val 然后返回 1) 而不是 self 和 other。这是更正的代码dbfiddle.uk/…
    【解决方案2】:

    原来是一个简单的错误...... 比较函数的实现将selfself 进行比较,而不是与other 进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-03
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2011-10-04
      相关资源
      最近更新 更多