3

我有一种称为预算的类型定义为

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;

谢谢

4

2 回答 2

4

您不需要该方法的参数:

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
于 2010-02-18T17:35:31.350 回答
1

这是一个范围界定问题。你的函数left_over()是一个方法 on Budget,这是一个单独的东西。但是,您希望有一种方法可以从一系列预算中进行查找。您编写的方法无法做到这一点,因为实例只能知道自己。2009 年的人怎么Budget可能知道 2010 年的数字?

您需要的是一个对象,该对象Budgets具有一个属性的集合Budget,以及一个成员函数 ,该函数返回其集合中left_over()给定的任何内容。Budget当然,获取该信息的唯一方法是迭代集合的方法,它的执行效率远低于常规表上的 WHERE 子句,但似乎是 OO 数据实践中的标准方法。

于 2010-02-18T18:27:44.763 回答