2012-03-29 21 views
5

Mam typ obiektu z konstruktorem bez-args, ale kiedy określam go jako wartość domyślną dla kolumny tego typu, otrzymuję ORA-00904: błąd nieprawidłowego identyfikatora.Oracle: określanie wartości domyślnej dla kolumny typu obiektu

przykład:

 
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 

Jeśli zastąpić domyślnych z np test_t (1), działa, ale ten rodzaj łamie paradygmat enkapsulacji OO, chcę, aby wszystkie pola tego samego typu miały te same domyślne "domyślne wartości" (mam nadzieję, że wiesz o co mi chodzi :-)

Brakuje mi coś tutaj, czy jest to normalne i nie jest możliwe użycie innych niż domyślne konstruktorów?

Odpowiedz

0

Wygląda na to, że nie jest to możliwe.

Jeden obejście byłoby użyć wyzwalacza:

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; 
/

Nie całkowicie ignorować niestandardowych konstruktorów przy okazji, przesłanianie domyślny konstruktor

CONSTRUCTOR FUNCTION test_t(in_val NUMBER) 
RETURN SELF AS RESULT 

prowadzi do wyjątek podczas próby zdefiniowania tabeli za pomocą DEFAULT NEW test_t(1):

ORA-06553: PLS-307: zbyt wiele deklaracje '' pasuje TEST_T niniejszego zaproszenia

+0

ORA-06553: PLS-307 jest wynikiem duplikatu definicji konstruktora, Oracle jest nieco zabawne, że; jeśli zastąpisz parametr parametru "in_val" wartością val (tak jak nazwa atrybutu), to poprawnie zastąpi domyślny konstruktor. –

+0

Dobrze, ale wciąż znajduje tego konstruktora ... –

+0

Jestem świadomy obejścia wyzwalacza, ale 5-10 linijek kodu dla czegoś, co powinno być możliwe w znacznie bardziej czytelny i łatwy sposób. Początkowo zakładałem, że nie jest to możliwe, ponieważ kontekst SQL nie jest widoczny wewnątrz kontekstu PL/SQL, ale tak nie jest, ponieważ wtedy żaden z obiektów OO nie działałby w czystym SQL. Więc ten problem jest albo niedopatrzeniem ze strony Oracle, albo jest jakaś składnia, której nie jestem świadomy ... –

Powiązane problemy