我可以通过Oracle中的对象方法为对象属性分配值吗?

问题描述

我得到了对象T_CONTRIBUYENTE,它具有属性HABILITADO和成员函数P_VERIFICAR_HABILitacION。该函数应该将'S'分配给self.HABILITADO,但是我不知道这是否可行。当我运行上面的代码时,出现错误

PLS-00363“表达式'SELF.HABILITADO'不能用作分配目标。

我认为这更多是一个概念上的问题,我不清楚。我用谷歌搜索,但找不到任何帮助。

    CREATE OR REPLACE TYPE T_CONTRIBUYENTE AS OBJECT
    (RUC VARCHAR2(11),NOMBRE VARCHAR2(50),APELLIDO_RAZON VARCHAR2(50),TIPO_CONTRIBUYENTE VARCHAR2(1),HABILITADO VARCHAR2(1),FECHA_VALIDEZ DATE,MEMBER FUNCTION P_VERIFICAR_HABILitacION RETURN VARCHAR2,STATIC FUNCTION F_OBTENER_CONTRIBUYENTE(RUC VARCHAR2) RETURN T_CONTRIBUYENTE);
    /
    CREATE OR REPLACE TYPE BODY T_CONTRIBUYENTE IS
        MEMBER FUNCTION P_VERIFICAR_HABILitacION RETURN VARCHAR2 IS
        CURSOR C_ULTPAGO IS
            SELECT MAX(p.fecha_pago) 
            FROM PAGOS p JOIN DECLaraCION d ON p.id=d.id
            WHERE d.RUC = SELF.RUC;
        FECHA_PAGO DATE;
        BEGIN
            OPEN C_ULTPAGO;
            FETCH C_ULTPAGO INTO FECHA_PAGO;
            CLOSE C_ULTPAGO;
            IF(MONTHS_BETWEEN(SYSDATE,FECHA_PAGO) <=1) THEN
                SELF.HABILITADO := 'S';
            ELSE
                SELF.HABILITADO := 'N';
            END IF;
       END;
END;

解决方法

当我们只读取SELF对象的属性时,我们可以依赖函数的隐式参数。但是,要修改对象,我们需要显式定义参数。因此,您需要将成员函数的签名更改为如下所示:

MEMBER FUNCTION P_VERIFICAR_HABILITACION (SELF IN OUT NOCOPY T_CONTRIBUYENTE) RETURN VARCHAR2 

顺便说一句,您的函数实际上没有返回任何内容,因此它将在运行时失败。如果您不希望它返回值,则应将其更改为“成员程序”。