假设我有一个像这样声明的Object和Table:
CREATE TYPE MyType AS OBJECT (
some_property NUMBER(20)
) NOT FINAL;
CREATE TABLE MyTable OF MyType;
如何指定默认值?对于普通表格,我会使用some_property NUMBER(20) DEFAULT 123
之类的内容。是否有可能对对象使用类似的东西?
我知道可能会重载构造函数,但我希望能够 以与没有对象相同的方式使用表(即,在插入数据时只能指定少量列,并默认其他列)。
答案 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)