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

时间:2019-05-31 18:17:26

标签: sql oracle user-defined-types

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;

但是无论顺序为升序还是降序,两个查询的结果都是相同的。

2 个答案:

答案 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)

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