2010-02-18 3 views
2

J'ai un type appelé le budget défini commeAppel fonction membre dans l'oracle 11g

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 le membre Fonction pour retourner le montant? Quelque chose comme:

select b.left_over(2010) from budget_table b; 

Merci

Répondre

1

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 de créer des tableaux comme celui-ci dans une vraie base de données d'entreprise!)

Pour restreindre 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 
+0

C'est académique. Aussi est-il possible de transmettre une valeur afin que je puisse simplement obtenir le budget 2010 et non 2009, etc. – joec

+0

Voir la réponse mise à jour - vous n'utiliseriez pas de paramètre pour le faire, vous sélectionneriez la ligne pour laquelle vous voulez le montant. –

+0

merci mais une partie des exigences est qu'il est passé dans la fonction. C'est pourquoi j'ai eu le paramètre dans ma tentative originale ... – joec

1

Il s'agit d'un problème de portée. Votre fonction left_over() est une méthode sur Budget, qui est une chose individuelle. Cependant, vous voulez avoir une méthode qui vérifie un éventail de budgets. La méthode telle que vous l'avez écrite ne peut pas faire cela, car une instance ne peut se connaître que sur elle-même. Comment le Budget 2009 peut-il connaître les chiffres pour 2010?

Qu'est-ce que vous avez besoin est un objet qui a Budgets une collection de Budget comme un attribut, et une fonction de 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 que la méthode itère sur la collection, ce qui sera beaucoup moins efficace qu'une clause WHERE sur une table normale, mais semble être l'approche standard dans les pratiques de données OO.

+0

Pourriez-vous fournir un extrait de code rapide de ce que vous voulez dire? Voulez-vous dire créer une table 'budgets' qui a une colonne de type d'objet de' Budget'? – joec

Questions connexes