Question

J'ai un type appelé le budget défini comme

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

Corps:

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

Et une table d'objet

create table budget_table of budget;

Comment puis-je utiliser la fonction de membre de remettre le montant? Quelque chose comme:

select b.left_over(2010) from budget_table b;

Merci

Était-ce utile?

La solution

Vous n'avez pas besoin d'un paramètre à la méthode:

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

(Je suppose que c'est un exercice académique, car il n'y aurait aucun sens pour créer des tableaux comme celui-ci dans une véritable base de données d'affaires!)

Pour limiter au budget pour une année donnée:

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

Autres conseils

Il est une question de portée. Votre fonction left_over() est une méthode sur Budget, ce qui est une chose individuelle. Cependant, vous voulez avoir une méthode qui fait un regard à partir d'une gamme de budgets. La méthode que vous avez écrit il ne peut pas le faire, car une instance ne peut savoir sur elle-même. Comment le Budget pour 2009 peut-être les chiffres savoir pour 2010?

Qu'est-ce que vous avez besoin est un Budgets objet qui a une collection de Budget comme un attribut, et une fonction membre left_over() qui renvoie le tout pour une Budget donnée dans sa collection. Bien sûr, la seule façon d'obtenir cette information est la méthode pour itérer sur la collection, qui se produira beaucoup moins efficace qu'une clause WHERE sur une table régulière mais semble être l'approche standard dans les pratiques de données OO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top