Oracle文档说:“与映射方法一样,只要定义了一种订购方法,只要需要比较该类型的两个对象,就会自动调用该订购方法。”
所以我认为使用“ 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;
但是无论顺序为升序还是降序,两个查询的结果都是相同的。
答案 0 :(得分: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;
| HEIGHT.VAL | | ---------: | | 130 | | 150 | | 180 |
select p.height.val from people p order by height DESC;
| HEIGHT.VAL | | ---------: | | 180 | | 150 | | 130 |
db <>提琴here
答案 1 :(得分:0)
原来是一个简单的错误...
比较功能的实现将self
与self
而不是other
进行比较。