4 Stimmen

Aufrufen einer Mitgliedsfunktion in Oracle 11g

Ich habe einen Typ namens Budget definiert als

create type budget as object ( 
    year number,
    amount number,
    member function left_over (year in number) return number
)

Körper:

create type body budget as
    member function left_over(year in number) return number is
    begin
        return amount;
    end left_over;
end;

Und eine Objekttabelle

create table budget_table of budget;

Wie verwende ich die Mitgliedsfunktion, um den Betrag zurückzugeben? Etwa so:

select b.left_over(2010) from budget_table b;

Danke

5voto

Tony Andrews Punkte 125904

Sie brauchen keinen Parameter für die Methode:

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

(Ich nehme an, dass dies eine akademische Übung ist, da es keinen Sinn machen würde, solche Tabellen in einer echten Unternehmensdatenbank zu erstellen).

Die Beschränkung auf den Haushalt eines bestimmten Jahres:

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 Stimmen

Es ist akademisch. Ist es auch möglich, einen Wert einzugeben, damit ich nur das Budget für 2010 erhalte und nicht für 2009 usw. Danke.

0 Stimmen

Siehe aktualisierte Antwort - Sie würden dafür keinen Parameter verwenden, sondern die Zeile auswählen, für die Sie den Betrag wünschen.

0 Stimmen

Danke, aber Teil der Anforderungen ist, dass es in die Funktion übergeben wird. Das, warum ich den Parameter in meinem ursprünglichen Versuch hatte...

1voto

APC Punkte 140727

Das ist eine Frage des Umfangs. Ihre Funktion left_over() ist eine Methode auf Budget was eine individuelle Sache ist. Sie wollen aber eine Methode haben, die eine Reihe von Budgets abfragt. Die Methode, so wie Sie sie geschrieben haben, kann dies nicht tun, weil eine Instanz nur über sich selbst Bescheid wissen kann. Wie kann die Budget für das Jahr 2009 vielleicht die Zahlen für 2010 kennen?

Was Sie brauchen, ist ein Objekt Budgets die eine Sammlung von Budget als Attribut, und eine Mitgliedsfunktion left_over() die das Was-auch-immer für eine bestimmte Budget in ihrer Sammlung. Die einzige Möglichkeit, diese Informationen zu erhalten, besteht natürlich darin, dass die Methode über die Sammlung iteriert, was weit weniger effizient ist als eine WHERE-Klausel für eine normale Tabelle, aber in der OO-Datenpraxis der Standardansatz zu sein scheint.

0 Stimmen

Könnten Sie einen kurzen Codeschnipsel bereitstellen, der zeigt, was Sie meinen? Meinen Sie die Erstellung einer budgets Tabelle, die eine Objekttypspalte von Budget ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X