2012-03-29 2 views
5

У меня есть тип объекта с конструктором no-args, но когда я укажу его как значение по умолчанию для столбца этого типа, я получаю 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 является результатом дубликата определения конструктора, Oracle несколько смешон в этом; если вы замените имя параметра in_val на val (как имя атрибута), он будет правильно переопределять конструктор по умолчанию. –

+0

Правильно, но все же он находит этот конструктор ... –

+0

Я знаю об обходном пути триггера, но 5-10 строк кода для чего-то, что должно быть возможно в гораздо более читабельном и управляемом режиме. Первоначально я предполагал, что это невозможно, потому что контекст SQL не видит внутри PL/SQL-контекста, но это явно не так, так как ни один из элементов OO не будет работать в чистом SQL. Таким образом, эта проблема является либо надзором со стороны Oracle, либо есть какой-то синтаксис, о котором я не знаю ... –

Смежные вопросы