2012-03-29 99 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