Oracle - порядок объектов - как это работает? - PullRequest
3 голосов
/ 31 мая 2019

Документ Oracle говорит следующее: «Как и в случае с методами отображения, метод порядка, если он определен, вызывается автоматически всякий раз, когда необходимо сравнить два объекта этого типа».

Так что я предполагаю, что он будет сортироваться при использовании clausule '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 запросов, независимо от того, является ли порядок asc или desc.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Я экспериментировал с вашим кодом и нашел решение.

Решение, которое работает, выглядит следующим образом

Я добавил вторую функцию сравнения с двумя параметрами

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 |

дБ <> скрипка здесь

0 голосов
/ 31 мая 2019

In оказалась простой ошибкой ... Реализация функции сравнения сравнивает self с self вместо other.

...