在Oracle 11g中调用成员函数

4

我有一个类型叫做“budget”,定义如下:

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;

谢谢

2个回答

5
您不需要给该方法传递任何参数:
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年的预算而不是2009年等等。谢谢。 - joec
请查看更新的答案 - 您不会使用参数来完成此操作,而是选择您想要金额的行。 - Tony Andrews
谢谢,但要求的一部分是将其传递到函数中。这就是为什么我在原始尝试中有参数的原因... - joec
使用预算信息,经理还应该随时能够计算出她/他在本年度剩余可支配金额。为了实现这一点,她/他需要一个函数,该函数接收年份并返回剩余可支配金额。 - joec
这是一个函数,不一定是对象的方法函数。 - Tony Andrews
显示剩余2条评论

1
这是一个作用域问题。你的函数left_over()Budget上的一个方法,它是一个独立的东西。然而,你想要一个方法来查找一系列预算。你目前编写的方法无法做到这一点,因为实例只能知道自己。2009年的Budget怎么可能知道2010年的数字呢?
你需要的是一个对象Budgets,它有一个Budget集合作为属性,并且一个成员函数left_over(),它返回其集合中给定Budget的任何内容。当然,获取该信息的唯一方法是让方法迭代整个集合,这比常规表上的WHERE子句效率要低得多,但似乎是面向对象数据实践的标准方法。

你能提供一个快速的代码片段来说明你的意思吗?你的意思是创建一个具有Budget对象类型列的budgets表格吗? - joec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接