2010-02-18 45 views
2

我有一個叫預算類型定義爲調用成員函數

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; 

感謝

回答

1

你並不需要一個參數的方法:

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

這是學術。也有可能通過一個價值,所以我可以得到2010年預算,而不是2009年等謝謝。 – joec

+0

查看更新的答案 - 你不會使用參數來做到這一點,你會選擇你想要的數量的行。 –

+0

謝謝,但部分要求是它傳遞給函數。這就是爲什麼我在原來的嘗試中有參數... – joec

1

這是一個範圍界定問題。你的功能left_over()Budget上的一種方法,這是個人的事情。但是,您希望有一種方法可以從一系列預算中進行查找。你寫的方法不能做到這一點,因爲一個實例只能知道它自己。 2009年的Budget怎麼可能知道2010年的數字?

你需要的是一個對象Budgets其中有Budget集合作爲一個屬性,和成員函數left_over()它返回無論其收集在一個給定Budget。當然,得到這些信息的唯一方法就是讓方法迭代集合,這比常規表上的WHERE子句執行效率低得多,但似乎是面向對象數據實踐中的標準方法。

+0

您能否提供一個您所指的快速代碼片段?你的意思是創建一個'預算'表,其中有一個對象類型列'預算'? – joec