• Jueves 14 de Noviembre de 2024, 23:21

Autor Tema:  Problema Con Member Function  (Leído 2256 veces)

Diclonius

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Problema Con Member Function
« en: Viernes 22 de Julio de 2005, 21:03 »
0
Hola, estoy empezando a trabajar con objetos en Oracle8i, y tengo un problema al tratar de actualizar una propiedad del objeto.

Por ejemplo si trabajo con un procedimiento, el procedimiento puede actualizar la propiedad miembro del objeto

********************** FUNCIONA **************************

CREATE OR REPLACE TYPE TO_TEST_P AS OBJECT
( CAMPO1 NUMBER(15,5),
  MEMBER PROCEDURE CHANGE_CAMPO1);
 
CREATE OR REPLACE TYPE BODY TO_TEST_P AS
   MEMBER PROCEDURE CHANGE_CAMPO1 IS
   BEGIN
     CAMPO1:=7;
     RETURN;
   END CHANGE_CAMPO1;
END;  
 
DECLARE
  OBJETO TO_TEST_P;
BEGIN
  OBJETO:=TO_TEST_P(1);
  OBJETO.CHANGE_CAMPO1;
  dbms_output.put_line('El procedimiento cambio el valor de la propiedad Campo1 a:['||Objeto.Campo1||']');
END;

***************************************************************

Pero si quisiera actualizar el dato con una funcion, me da error  <_<  , probe tambien creando un procedimiento para que la funcion llamara al procedimiento y este actualizara, pero tampoco funciona.. es que acaso las funciones no pueden alterar datos del objeto?
Si pongo en comentario la linea que actualiza el campo, la funcion trabaja sin problemas.





************ NO FUNCIONA ****************************

CREATE OR REPLACE TYPE TO_TEST_F AS OBJECT
( CAMPO1 NUMBER(15,5),
  MEMBER FUNCTION CHANGE_CAMPO1 RETURN NUMBER);
 
CREATE OR REPLACE TYPE BODY TO_TEST_F AS
   MEMBER FUNCTION CHANGE_CAMPO1 RETURN NUMBER IS
   BEGIN
     CAMPO1:=8; -- Si se comentaria esta linea funciona.
     RETURN 2;
   END CHANGE_CAMPO1;
END;  
 
DECLARE
  OBJETO TO_TEST_F;
  RESULT NUMBER;
BEGIN
  OBJETO:=TO_TEST_F(1);
  RESULT:=OBJETO.CHANGE_CAMPO1;
  dbms_output.put_line('La funcion cambio el valor de la propiedad Campo1 a :['||Objeto.Campo1||']');
END;

**************************************************************
El Error

ORA-04068: existing state of packages has been discarded
ORA-04063: stored procedure "SWBAPPS.TO_TEST_F" has errors
ORA-06508: PL/SQL: could not find program unit being called
ORA-06512: at line 6




Gracias...

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema Con Member Function
« Respuesta #1 en: Viernes 22 de Julio de 2005, 21:30 »
0
Segun entiendo elprocedieminto si lo puede hacer porque de hecho el ser procedimeinto implica que las modificaciones resultantes son internas puesto que no hay valor de retorno, mientras que la funcion no lo puede hacer de esa manera porque si hay valor de retorno.

Asi que deberias hacerlo asi:

Código: Text
  1.  
  2. CREATE OR REPLACE TYPE to_test_f AS OBJECT (
  3.    campo1   NUMBER (15, 5),
  4.    MEMBER FUNCTION change_campo1
  5.       RETURN NUMBER
  6. )
  7. /
  8. CREATE OR REPLACE TYPE BODY to_test_f AS
  9.    MEMBER FUNCTION change_campo1
  10.       RETURN NUMBER IS
  11.        BEGIN
  12.       RETURN 8;
  13.    END change_campo1;
  14. END;
  15. /
  16.  

y para llamarlo seria:

Código: Text
  1.  
  2. DECLARE
  3.    objeto   to_test_f;
  4.    RESULT   NUMBER;
  5. BEGIN
  6.    objeto := to_test_f (1);
  7.    objeto.campo1 := objeto.change_campo1;
  8.    DBMS_OUTPUT.put_line (   'La funcion cambio el valor de la propiedad Campo1 a :['
  9.                          || objeto.campo1
  10.                          || ']'
  11.                         );
  12. END;
  13.  
  14.  
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Diclonius

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Problema Con Member Function
« Respuesta #2 en: Viernes 22 de Julio de 2005, 21:41 »
0
Aunque eso es valido, es inutil bajo el concepto de OO, ya que no estoy encapsulado las funcionalidades que quiero, imagina que quiero que la funcion actualize 15 propiedades y que el objeto lo utilizaran en 50 programas, cada uno de los programas tendria que encargarse de actualizar las 15 propiedades !!!

Lo que dices de que los procedimiento modifican datos y las funciones no, lo recuerdo de lenguajes muuy antiguos, no quiero creer que los Objetos de Oracle tengan estas restricciones, tendria que trabajar solo con procedimientos, lo que seria muy poco elegante... <_<

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema Con Member Function
« Respuesta #3 en: Viernes 22 de Julio de 2005, 21:54 »
0
umm si es raro, no se que decirte.

pero para que quieres encapsular un atributo con una funcion? si precisamente el estar encapsulado no requiere que se devuelva ningn valor cuando se asigna.

es decir para hacer SET tienes un procedimiento  y para hacer GET tienes una funcion, de hecho en lenguaje como java lo debes hacer asi, aunque alli no hay la limitante de que al asignar no se devuelva valor.

en el guajes como C# es lo mismo, es decir solo devuelve
(funcion) cuando se hace GET y solo establece cuanto se hace SET.
Código: Text
  1.  
  2. //ejemplo C#.
  3. private cadena;
  4. public string Cadena
  5. {
  6.     get
  7.     {
  8.         return cadena;
  9.     }
  10.  
  11.     set
  12.    {
  13.      cadena = value;
  14.    }
  15. }
  16.  
  17. //ejemplo java
  18.  
  19. private String cadena;
  20.  
  21. public String GetCadena()
  22. {
  23.   return cadena;
  24. }
  25.  
  26. public void SetCadena(String valor)
  27. {
  28.    cadena = valor;
  29. }
  30.  
  31.  
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema Con Member Function
« Respuesta #4 en: Viernes 22 de Julio de 2005, 21:57 »
0
por otro lado con un solo procedimeinto puedes asignar mas de 1 atributo.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io