首页 文章

Oracle:指定对象类型列的默认值

提问于
浏览
5

我有一个带有no-args构造函数的对象类型,但是当我将它指定为该类型列的默认值时,我得到ORA-00904:无效的标识符错误 .

例:

CREATE OR REPLACE TYPE test_t AS OBJECT
(
  val      NUMBER(10),
  CONSTRUCTOR FUNCTION test_t return self as result
)

CREATE OR REPLACE TYPE BODY test_t AS 
  CONSTRUCTOR FUNCTION test_t RETURN SELF AS RESULT IS
  BEGIN
    val := 1;
    RETURN;
  END;
END;

CREATE TABLE test_table (
    test_attr test_t DEFAULT new test_t()
)

Error: ORA-00904: "INKA"."TEST_T"."TEST_T": invalid identifier

如果我用例如DEFAULT替换test_t(1),它的工作原理,但是那种打破了OO封装范式,我希望所有相同类型的字段都具有相同的默认“默认值”(希望你知道我的意思:-)

我在这里遗漏了什么,或者这是正常的,并且不可能使用像这样的非默认构造函数?

1 回答

  • 0

    看起来这是不可能的 .

    一种解决方法是使用触发器:

    CREATE OR REPLACE TRIGGER test_trigger
      BEFORE INSERT OR UPDATE
    ON test_table
      FOR EACH ROW
    WHEN ( new.test_attr IS NULL )
    BEGIN
      :new.test_attr := NEW test_t();
    END test_trigger;
    /
    

    顺便说一下,它不会完全忽略非默认构造函数,而是覆盖默认构造函数

    CONSTRUCTOR FUNCTION test_t(in_val NUMBER)
    RETURN SELF AS RESULT
    

    尝试使用 DEFAULT NEW test_t(1) 定义表时导致异常:

    ORA-06553:PLS-307:太多'TEST_T'声明符合此调用

相关问题