Oracle中如何在自定义OBJECT类型中定义常量属性?
Oracle对象类型常量属性实现方案
首先明确结论:
- 该需求可实现,但不支持直接在类型声明的属性段定义CONSTANT常量属性,你预期的
Att CONSTANT VARCHAR2(200) := 'Something'写法不符合Oracle对象类型的语法规则,直接执行会抛出PLS-00352: 无法在对象类型说明中使用CONSTANT错误。 - 不存在直接在属性声明段定义常量的写法,需要通过类型成员方法、或者自定义构造函数的方式实现常量效果。
推荐方案:用静态成员函数模拟常量
这是最贴近常量特性的实现方式,不需要实例化对象即可调用,值不可被篡改,完全满足常量使用需求。
首先定义类型声明:
CREATE OR REPLACE TYPE MYOBJ AS OBJECT( -- 如果你不需要Att作为可变属性,可以直接删掉这行,只保留静态函数 Att VARCHAR2(200), STATIC FUNCTION CONST_ATT RETURN VARCHAR2 ); /
然后编写类型体实现静态函数:
CREATE OR REPLACE TYPE BODY MYOBJ AS STATIC FUNCTION CONST_ATT RETURN VARCHAR2 IS BEGIN RETURN 'Something'; END CONST_ATT; END; /
调用时无需创建对象实例,直接执行SELECT MYOBJ.CONST_ATT FROM DUAL;即可拿到固定常量值,外部没有任何途径修改这个返回值。
备选方案:自定义构造函数锁定属性值
如果你必须保留Att作为对象的实例属性,而非通过函数获取值,可以通过自定义无参构造函数,强制所有实例化对象的Att属性固定为常量值。
类型声明写法:
CREATE OR REPLACE TYPE MYOBJ AS OBJECT( Att VARCHAR2(200), CONSTRUCTOR FUNCTION MYOBJ RETURN SELF AS RESULT ); /
类型体实现:
CREATE OR REPLACE TYPE BODY MYOBJ AS CONSTRUCTOR FUNCTION MYOBJ RETURN SELF AS RESULT IS BEGIN SELF.Att := 'Something'; RETURN; END MYOBJ; END; /
该方案的缺陷是无法彻底禁止Att属性被修改:实例化对象后,依然可以通过赋值语句更改Att的值,安全性弱于静态函数方案。
额外说明:Oracle从12c版本开始支持对象类型的静态成员,但始终没有开放对象属性直接声明CONSTANT的语法,所有常量类的需求都需要通过上述两种方式实现。
内容的提问来源于stack exchange,提问作者hajduk
相关产品推荐
相关产品推荐

