Chamando a função do membro no Oracle 11g
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
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.