【问题标题】:Calling member function in oracle 11g在 oracle 11g 中调用成员函数
【发布时间】:2011-01-18 10:33:35
【问题描述】:

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

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;

谢谢

【问题讨论】:

    标签: oracle oracle11g


    【解决方案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
    

    【讨论】:

    • 这是学术性的。也可以传递一个值,这样我就可以得到 2010 年的预算,而不是 2009 年等。谢谢。
    • 查看更新的答案 - 您不会使用参数来执行此操作,而是选择您想要金额的行。
    • 谢谢,但部分要求是它被传递到函数中。这就是为什么我在最初的尝试中使用了参数...
    • 这没有任何意义 - 如果这是目标,您不妨创建一个独立函数!您将不得不从相关行中选择数据。
    • 也许您应该发布作业问题 - 可能是您误解了它?
    【解决方案2】:

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

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

    【讨论】:

    • 你能提供一个快速的代码 sn-p 你的意思吗?你的意思是创建一个budgets 表,其中的对象类型列为Budget
    猜你喜欢
    • 2011-01-20
    • 2020-01-23
    • 1970-01-01
    • 2015-12-19
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多