Oracle数据库UDT中Setter方法的实现可行性咨询
在Oracle UDT中创建Setter方法的可行性解答
嘿,很高兴看到你在摸索Oracle用户定义类型(UDT)的方法!针对你的问题,答案是完全可以创建Setter方法——不过要注意几个关键细节,让你的方法能真正修改对象的属性。
先来拆解你的示例:你当前定义的是MEMBER FUNCTION,虽然能正常编译,但如果要实现“设置属性值”的Setter语义,更合适的选择是MEMBER PROCEDURE(因为Setter通常不需要返回值,专注于修改状态);如果坚持要用FUNCTION,也可以实现,只是语义上不如PROCEDURE清晰。
方案1:使用MEMBER PROCEDURE实现Setter(推荐)
这是最符合Setter语义的方式,因为它专门用于执行修改操作,不需要返回值:
首先定义类型:
CREATE TYPE TestType2 AS OBJECT( Numb NUMBER(4), Str VARCHAR2(10), -- 定义Setter过程,无返回值 MEMBER PROCEDURE setNum(numba NUMBER), -- 搭配一个Getter方法方便验证 MEMBER FUNCTION getNum RETURN NUMBER ); /
然后实现类型体:
CREATE TYPE BODY TestType2 AS MEMBER PROCEDURE setNum(numba NUMBER) IS BEGIN -- 必须用SELF引用当前对象的属性,才能修改实例状态 SELF.Numb := numba; END; MEMBER FUNCTION getNum RETURN NUMBER IS BEGIN RETURN SELF.Numb; END; END; /
方案2:使用MEMBER FUNCTION实现Setter(可选)
如果你确实需要Setter返回值(比如返回设置后的数值或成功标识),也可以保留FUNCTION的形式,但同样要通过SELF修改属性:
CREATE TYPE TestType2 AS OBJECT( Numb NUMBER(4), Str VARCHAR2(10), MEMBER FUNCTION setNum(numba NUMBER) RETURN NUMBER ); / CREATE TYPE BODY TestType2 AS MEMBER FUNCTION setNum(numba NUMBER) RETURN NUMBER IS BEGIN SELF.Numb := numba; -- 返回传入的数值,或者自定义的成功码 RETURN numba; END; END; /
验证Setter效果
你可以通过PL/SQL块测试方法是否生效:
DECLARE my_test_obj TestType2 := TestType2(100, 'Demo'); BEGIN DBMS_OUTPUT.PUT_LINE('初始Numb值: ' || my_test_obj.getNum()); my_test_obj.setNum(200); DBMS_OUTPUT.PUT_LINE('设置后的Numb值: ' || my_test_obj.getNum()); END; /
执行后会输出:
初始Numb值: 100
设置后的Numb值: 200
关键要点
- 必须使用
SELF关键字来引用当前对象的属性,否则无法修改实例的状态(成员方法默认不会直接操作对象属性,需要显式通过SELF访问)。 - 从语义角度,Setter更适合用
PROCEDURE,FUNCTION更适合用于获取数据或计算结果的场景。
内容的提问来源于stack exchange,提问作者A.A
相关产品推荐
相关产品推荐

