2012-03-29 102 views
5

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

实施例:

 
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封装范例,我希望所有相同类型的字段具有相同的默认“默认值”(希望你知道我的意思:-)

我是否缺少在这里的东西,或者这是正常的,它是不可能使用这样的非默认构造函数?

回答

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' 的声明太多匹配这个电话

+0

ORA-06553:PLS-307相同的构造函数定义的结果,甲骨文是在有些古怪;如果用val替换“in_val”参数名称(因为是属性的名称),它将正确地覆盖默认构造函数。 – 2012-03-29 13:39:14

+0

没错,但它仍然找到了这个构造函数...... – 2012-03-29 13:42:14

+0

我知道触发器的解决方法,但是对于应该可以以更易读易懂的方式进行操作的代码,需要5-10行代码。最初我假定这是不可能的,因为SQL上下文在PL/SQL上下文中没有看到,但显然不是这种情况,因为没有OO的东西可以在纯SQL中工作。所以这个问题要么是Oracle的监督,要么是我没有意识到的一些语法...... – 2012-03-29 13:47:19