【问题标题】:Default values for Objects in OracleDBOracleDB 中对象的默认值
【发布时间】:2016-07-11 07:24:34
【问题描述】:

假设我有一个像这样声明的对象和表:

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

CREATE TABLE MyTable OF MyType;

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

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

【问题讨论】:

  • 您可以创建默认构造函数。请参阅此链接stackoverflow.com/questions/17939882/…
  • 是否可以使用现有的语法来插入对象,例如insert into MyTable(some_property) values (1)insert into MyTable values () ?

标签: sql oracle object relational-database


【解决方案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)

【讨论】:

  • 好吧,似乎没有更好的办法了,我的目标是能够对对象使用相同的语法,这样现有的代码仍然可以工作。
  • @tobspr 我添加了一条我最近从一次测验中知道的笔记。这可能对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2014-08-18
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2014-08-12
相关资源
最近更新 更多