Pergunta

Eu tenho um tipo chamado orçamento definido como

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

Corpo:

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

E uma tabela de objeto

create table budget_table of budget;

Como uso a função do membro para retornar o valor? Algo como:

select b.left_over(2010) from budget_table b;

Obrigado

Foi útil?

Solução

Você não precisa de um parâmetro para o método:

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

(Suponho que este seja um exercício acadêmico, pois não faria sentido criar tabelas como essa em um banco de dados de negócios real!)

Para restringir o orçamento para um determinado ano:

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

Outras dicas

É uma questão de escopo. Sua função left_over() é um método em Budget, que é uma coisa individual. No entanto, você deseja ter um método que procure em vários orçamentos. O método como você escreveu não pode fazer isso, porque uma instância só pode saber sobre si mesma. Como pode o Budget Para 2009, possivelmente conhece os números de 2010?

O que você precisa é um objeto Budgets que tem uma coleção de Budget como um atributo e uma função de membro left_over() que retorna o que quer que seja para um dado Budget em sua coleção. Obviamente, a única maneira de obter essas informações é o método para iterar sobre a coleção, que terá um desempenho muito menos eficiente do que uma cláusula onde em uma tabela regular, mas parece ser a abordagem padrão nas práticas de dados OO.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top