You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会自动调用系统默认的全属性构造函数,而不是你写的带默认值的自定义构造函数,这才是默认值完全没生效的核心原因。

修正方案

  1. 先修正子类构造函数,显式调用父类构造:
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;
/
  1. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:57:02