3

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;

但无论 order 是 asc 还是 desc,2 个查询的结果都是相同的。

4

2 回答 2

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<>在这里摆弄

于 2019-05-31T19:07:20.900 回答
0

结果证明是一个简单的错误... compare 函数的实现self用 withself而不是 with other

于 2019-05-31T20:10:37.523 回答