Вызов функции-члена в Oracle 11g - PullRequest
2 голосов
/ 18 февраля 2010

У меня есть тип, называемый бюджет, определенный как

create type budget as object ( 
    year number,
    amount number,
    member function left_over (year in number) return number
)

Тело:

create type body budget as
    member function left_over(year in number) return number is
    begin
        return amount;
    end left_over;
end;

И таблица объектов

create table budget_table of budget;

Как использовать функцию-член для возврата суммы? Что-то вроде:

select b.left_over(2010) from budget_table b;

Спасибо

Ответы [ 2 ]

3 голосов
/ 18 февраля 2010

Вам не нужен параметр для метода:

SQL> create or replace type budget as object (
  2      year number,
  3      amount number,
  4      member function left_over return number
  5  )
  6  /

Type created.

SQL> create or replace type body budget as
  2      member function left_over return number is
  3      begin
  4          return amount;
  5      end left_over;
  6  end;
  7  /

Type body created.

SQL> create table budget_table of budget;

Table created.

SQL> insert into budget_table values (budget(2010,99));

1 row created.

SQL> commit;

Commit complete.

SQL> select b.left_over() from budget_table b;

B.LEFT_OVER()
-------------
           99

(Я предполагаю, что это академическое упражнение, поскольку не имеет смысла создавать такие таблицы в реальной бизнес-базе данных!)

Для ограничения бюджета на определенный год:

SQL> insert into budget_table values (budget(2010,99));

1 row created.
SQL> select b.left_over() from budget_table b;

B.LEFT_OVER()
-------------
           88
           99

SQL> select b.left_over() from budget_table b
  2  where b.year = 2010;

B.LEFT_OVER()
-------------
           99
1 голос
/ 18 февраля 2010

Это вопрос объема. Ваша функция left_over() - это метод для Budget, который является отдельной вещью. Тем не менее, вы хотите иметь метод, который делает поиск из ряда бюджетов. Метод, который вы написали, не может этого сделать, потому что экземпляр может знать только о себе. Как может Budget за 2009 год узнать цифры за 2010 год?

Вам нужен объект Budgets, который имеет коллекцию Budget в качестве атрибута, и функцию-член left_over(), которая возвращает что угодно для данного Budget в своей коллекции. Конечно, единственный способ получить эту информацию - это метод для итерации по коллекции, который будет работать гораздо менее эффективно, чем предложение WHERE в обычной таблице, но, похоже, является стандартным подходом в практике работы с данными ОО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...