Pregunta

Tengo un tipo llamado presupuesto define como

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

del cuerpo:

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

Y una tabla de objetos

create table budget_table of budget;

¿Cómo se utiliza la función de miembro a devolver el importe? Algo así como:

select b.left_over(2010) from budget_table b;

Gracias

¿Fue útil?

Solución

No es necesario un parámetro para el método:

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

(supongo que se trata de un ejercicio académico, ya que no tendría sentido para crear tablas de este tipo en una base de datos de negocios de verdad!)

Para restringir al presupuesto para un año en particular:

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

Otros consejos

Es una cuestión de alcance. Su función es left_over() un método de Budget, que es una cosa individual. Sin embargo, usted quiere tener un método que hace una mirada a partir de una serie de presupuestos. El método que usted ha escrito que no puede hacer esto, porque una instancia sólo puede saber acerca de sí mismo. ¿Cómo puede la Budget para 2009 posiblemente conocer las cifras para el año 2010?

Lo que necesita es un Budgets objeto que tiene una colección de Budget como un atributo, y una left_over() función miembro que devuelve el lo que sea para un determinado Budget en su colección. Por supuesto, la única manera de conseguir que la información es para el método para iterar sobre la colección, que llevará a cabo mucho menos eficiente que una cláusula WHERE en una mesa normal, pero que parece ser el enfoque estándar en la utilización de los datos OO.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top