Oracle创建对象类型时如何设置常量?构造函数默认值插入为空问题
问题根因
- 子类构造函数未显式调用父类构造函数
Oracle对象类型的子类构造函数不会自动触发父类的自定义构造逻辑,你当前的CallTY构造函数只给子类自有属性赋值,完全没有处理父类的Datetime、Customer、Content三个属性,父类的默认值规则自然不会生效。 - 构造函数调用时显式传入了空值覆盖默认值
你INSERT语句里调用CallTY时,第一个参数传了''(Oracle中''等价于NULL),直接给Datetime赋值为NULL,覆盖了父类构造的默认值;最后一个参数也传了'',直接覆盖了Op_type的默认值'Call'。 - 存在笔误影响类型继承
你定义CallTY时写的是UNDER OperatinTY,少了字母e,正确应为UNDER OperationTY,这个笔误如果没修正的话类型继承本身就会失效。 - 自定义构造函数的参数匹配逻辑错误
你定义的CallTY构造函数参数只有4个(Duration、Location、Receiver、Op_type),但你INSERT时传了7个参数,此时Oracle会自动调用系统默认的全属性构造函数,而不是你写的带默认值的自定义构造函数,这才是默认值完全没生效的核心原因。
修正方案
- 先修正子类构造函数,显式调用父类构造:
CREATE OR REPLACE TYPE CallTY UNDER OperationTY( Duration NUMBER, Location VARCHAR2(20), Receiver VARCHAR2(20), Op_type VARCHAR2(4), CONSTRUCTOR FUNCTION CallTY ( -- 先声明父类需要的参数 Datetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP, Customer REF CustomerTY DEFAULT NULL, Content BLOB DEFAULT NULL, -- 再声明子类自有参数 Duration NUMBER DEFAULT NULL, Location VARCHAR2 DEFAULT NULL, Receiver VARCHAR2 DEFAULT NULL, Op_type VARCHAR2 DEFAULT 'Call') RETURN SELF AS RESULT ); / CREATE OR REPLACE TYPE BODY CallTY AS CONSTRUCTOR FUNCTION CallTY ( Datetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP, Customer REF CustomerTY DEFAULT NULL, Content BLOB DEFAULT NULL, Duration NUMBER DEFAULT NULL, Location VARCHAR2 DEFAULT NULL, Receiver VARCHAR2 DEFAULT NULL, Op_type VARCHAR2 DEFAULT 'Call') RETURN SELF AS RESULT IS BEGIN -- 先调用父类构造函数初始化父类属性 SELF.OperationTY(Datetime, Customer, Content); -- 再初始化子类属性 SELF.Duration := Duration; SELF.Location := Location; SELF.Receiver := Receiver; SELF.Op_type := Op_type; RETURN; END; END; /
- 调整INSERT语句,使用命名参数传值,避免传不需要的空值触发默认规则:
Insert into Operation values ( CallTY( Customer => (Select REF(c) from customer c Where c.name = 'John'), Duration => 1, Location => 'London', Receiver => '1234567890' ) );
调整后不传Datetime和Op_type参数,就会自动走你定义的默认值,Datetime取CURRENT_TIMESTAMP,Op_type取'Call'。
内容的提问来源于stack exchange,提问作者mikerug88
相关产品推荐
相关产品推荐

