Setter Oracle 数据库中 UDT 中的方法

Setter methods in UDT in Oracle database

我对此还很陌生,正在努力解决这个问题。 UDT 能够定义您可以在存储的对象上调用的方法,我似乎创建了一个 returns 值很好的方法,但想知道是否可以创建一个 setter 方法。这个场景不是很有用,但它很简单只是为了澄清

比如我有这个类型:

create TYPE TestType2 AS OBJECT(
Numb NUMBER(4),
Str VARCHAR2(10),
MEMBER FUNCTION setNum(numba NUMBER) RETURN NUMBER
);

编译得很好所以我的假设 setter 方法是允许的 我已尝试创建以下主体类型:

CREATE TYPE BODY TestType2 as
member function setNum(numba NUMBER) return NUMBER is
    begin
        SELF.Numb := numba;
        return SELF.Numb;
    END;
END;

然而,这不会给我以下错误:

Error(3,9): PL/SQL: Statement ignored
Error(3,14): PLS-00363: expression 'SELF.NUMB' cannot be used as an assignment target

有没有办法创建 set 方法,或者这是否只允许在存储过程中使用?

这是一个模糊的错误。问题是成员函数采用 SELF 的隐式参数。所以如果你想改变一些东西,你需要明确参数:

create or replace TYPE TestType2 AS OBJECT(   
    Numb NUMBER(4,0),
    Str VARCHAR2(10),
    MEMBER procedure setNum(self in out TestType2, numba NUMBER )
 );
/
CREATE or replace TYPE BODY TestType2 as
    member function setNum(self in out TestType2 , numba NUMBER) return NUMBER 
    is
    begin
        self.Numb := numba;
        return SELF.Numb;
    END;
END;
/

请注意,调用函数时 SELF 参数保持隐式:

declare
   t TestType2 := TestType2(4, 'TEST');
   n pls_integer;
begin
    dbms_output.put_line('1' || t.numb);
    n := t.setNum(8);
    dbms_output.put_line('2' || t.numb);
end;
/

顺便说一下,setter 方法不需要是函数;我们也可以有会员程序。

create or replace TYPE TestType2 AS OBJECT(
    Numb NUMBER(4,0),
    Str VARCHAR2(10),
    MEMBER procedure setNum(self in out TestType2, numba NUMBER ),
    MEMBER FUNCTION getNum RETURN NUMBER
);
/
CREATE or replace TYPE BODY TestType2 as
    member procedure setNum(self in out TestType2, numba NUMBER )
is
    begin
        self.Numb := numba;
    END;

    MEMBER FUNCTION getNum RETURN NUMBER
    is
    begin
        return self.numb;
    end;
END;
/