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()は のメソッドでBudgetあり、これは個別のものです。ただし、予算の範囲からルックアップを行うメソッドが必要です。インスタンスは自分自身についてしか知ることができないため、あなたが書いたメソッドはこれを行うことができません。2009 年の数字はどうやっBudgetて 2010 年の数字を知ることができるでしょうか?

必要なのは、属性としてBudgetsのコレクションを持つオブジェクトと、そのコレクション内の指定されたものを返すBudgetメンバー関数 です。もちろん、その情報を取得する唯一の方法は、メソッドがコレクションを反復処理することです。これは、通常のテーブルの WHERE 句よりもはるかに効率が低くなりますが、オブジェクト指向データ プラクティスの標準的なアプローチのようです。 left_over()Budget

于 2010-02-18T18:27:44.763 に答える