我有一个带有无参数构造函数的对象类型,但是当我将其指定为该类型列的默认值时,会收到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
如果用例如test_t(1)替换DEFAULT,它可以工作,但是这种方式破坏了OO封装范例,我希望所有相同类型的字段都具有相同的默认“默认值”(希望您知道我的意思是:-)
我是否在这里缺少某些东西,或者这是正常现象,并且无法使用像这样的非默认构造函数?
看起来这是不可能的。
一种解决方法是使用触发器:
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):
DEFAULT NEW test_t(1)
ORA-06553:PLS-307:太多的“ TEST_T”声明与该调用匹配