OracleDB中对象的默认值

时间:2016-07-11 07:24:35

标签: sql oracle object relational-database

假设我有一个像这样声明的Object和Table:

CREATE TYPE MyType AS OBJECT (
   some_property NUMBER(20)
) NOT FINAL;

CREATE TABLE MyTable OF MyType;

如何指定默认值?对于普通表格,我会使用some_property NUMBER(20) DEFAULT 123之类的内容。是否有可能对对象使用类似的东西?

我知道可能会重载构造函数,但我希望能够 以与没有对象相同的方式使用表(即,在插入数据时只能指定少量列,并默认其他列)。

1 个答案:

答案 0 :(得分:1)

因此,由于误解而添加完整答案而不是评论

<强> DDL

CREATE TYPE MyType AS OBJECT (
   some_property NUMBER(20),
  CONSTRUCTOR FUNCTION MyType(some_property number default 123) RETURN SELF AS RESULT
) NOT FINAL;
/

CREATE OR REPLACE TYPE BODY MyType AS
  CONSTRUCTOR FUNCTION MyType(some_property number default 123)
    RETURN SELF AS RESULT
  AS
  BEGIN
    SELF.some_property := some_property;
    RETURN;
  END;
END;
/

CREATE TABLE MyTable OF MyType;

DML 就像这样

-- Insert row with 123
INSERT INTO MyTable(some_property)
VALUES(MyType().some_property);
/

-- Insert row with 456
INSERT INTO MyTable(some_property)
VALUES(MyType(456).some_property);
/

在我看来,当使用列对象

创建表时,构造函数更灵活
create table testt (
      v mytype);
/

insert into testt values(MyType());
/

insert into testt values(MyType(456));
/

<强>更新

我认为你不能像使用构造函数那样使用对象类型写insert into <table> values()这样的smt。另请参阅触发器Oracle: specifying default value for object type column的解决方法。但它并不可靠。

再补充一点

最近我知道还有一件事你可以将默认值添加到嵌套表列,因为它是普通表。我认为这是禁止的。

看看这个

CREATE TYPE MyType AS OBJECT (
   some_property NUMBER(20),
   test_property NUMBER(20)
);

CREATE TABLE MyTable OF MyType
 ( some_property default '123' ); -- this simply transforms into 'alter table MYTABLE modify some_property default '123';'

 insert into MyTable(test_property) values(1)