Oracle - 对象顺序 - 它是如何工作的?

Oracle - object order - how does it work?

Oracle 文档是这样说的:"As with map methods, an order method, if one is defined, is called automatically whenever two objects of that type need to be compared."

所以我假设它会在使用 '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;

然后我的 table 看起来像这样:

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;

但是无论顺序是升序还是降序,两次查询的结果都是一样的。

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

有效的解决方案如下所示

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

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;
| HEIGHT.VAL |
| ---------: |
|        130 |
|        150 |
|        180 |
select p.height.val from people p order by height DESC;
| HEIGHT.VAL |
| ---------: |
|        180 |
|        150 |
|        130 |

db<>fiddle here

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