2012-03-29 14 views
5

Ho un tipo di oggetto con costruttore no-args, ma quando lo specifico come valore predefinito per una colonna di quel tipo, ottengo ORA-00904: errore di identificatore non valido.Oracle: specifica il valore predefinito per la colonna del tipo di oggetto

Esempio:

 
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 

Se sostituisco default con es test_t (1), funziona, ma quel tipo di rompe il paradigma di incapsulamento OO, voglio che tutti i campi dello stesso tipo abbiano gli stessi "valori predefiniti" predefiniti (spero tu sappia cosa intendo :-)

Mi manca qualcosa qui, o è normale e non è possibile usare costruttori non predefiniti come questo?

risposta

0

Sembra che questo non sia possibile.

Una soluzione sarebbe quella di utilizzare un trigger:

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

Non ignora completamente i costruttori non predefiniti per la via, ignorando il costruttore di default

CONSTRUCTOR FUNCTION test_t(in_val NUMBER) 
RETURN SELF AS RESULT 

porta ad un eccezione quando si tenta di definire la tabella con DEFAULT NEW test_t(1):

ORA-06553: PLS-307: troppe dichiarazioni di 'TEST_T' corrispondono a questa chiamata

+0

ORA-06553: PLS-307 è risultato di definizione costruttore duplicato, Oracle è in qualche modo divertente in questo; se si sostituisce il nome del parametro "in_val" con val (come il nome dell'attributo), esso sovrascriverà correttamente il costruttore predefinito. –

+0

Esatto, ma trova ancora questo costruttore ... –

+0

Sono a conoscenza della soluzione alternativa, ma 5-10 righe di codice per qualcosa che dovrebbe essere possibile in un modo molto più leggibile e gestibile. Inizialmente supponevo che non fosse possibile perché il contesto SQL non vede all'interno del contesto PL/SQL, ma chiaramente non è il caso da allora nessuna delle cose OO funzionerebbe in puro SQL. Quindi questo problema o è una svista su Oracle, o c'è qualche sintassi di cui non sono a conoscenza ... –

Problemi correlati