Intereting Posts
Автоматически удалять пробелы в последовательности первичных ключей Нулевые или ненулевые типы данных varchar – что быстрее для запросов? Как мы можем управлять динамическим упорядочением по полю в таблице? Должны ли они быть 3 таблицами SQL или один? Колонка запроса с типом данных char в oracle В чем разница между Left, Right, Outer и Inner Joins? Объясните, как предложение порядка может быть использовано в Rails MySQL полный текстовый поиск слов с тремя или менее буквами Ограничить отношение внешних ключей к строкам связанных подтипов Разрешения, запрещенные по запросу sql SQL Найти всех прямых потомков в дереве SQL Server: как получить все дочерние записи с учетом родительского идентификатора в собственной справочной таблице Порт SQL Server заблокирован Как сворачивать данные из одной таблицы с SQL Server 2005 Запрос PostgreSQL для подсчета / группировки по дням и отображения дней без данных

Oracle: указание значения по умолчанию для столбца типа объекта

У меня есть тип объекта с конструктором no-args, но когда я укажу его как значение по умолчанию для столбца этого типа, я получаю ORA-00904: неверная ошибка идентификатора.

Пример:

 СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТИП test_t AS OBJECT
 (
   val NUMBER (10),
   ФУНКЦИЯ КОНСТРУКТОРА test_t возвращает себя как результат
 )

 СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТИП BODY test_t AS 
   ФУНКЦИЯ КОНСТРУКТОРА test_t ВОЗВРАТ В САМОМ РЕЗУЛЬТАТЕ
   НАЧАТЬ
     val: = 1;
     ВЕРНУТЬ;
   КОНЕЦ;
 КОНЕЦ;

 CREATE TABLE test_table (
     test_attr test_t DEFAULT new test_t ()
 )

 Ошибка: ORA-00904: «INKA». «TEST_T». «TEST_T»: недопустимый идентификатор

Если я заменил DEFAULT, например, на test_t (1), он работает, но этот тип разбивает парадигму инкапсуляции OO, я хочу, чтобы все поля одного типа имели одинаковые значения по умолчанию «по умолчанию» (надеюсь, вы знаете, что я имею в виду 🙂

Я что-то пропустил здесь, или это нормально, и нельзя использовать конструкторы, не относящиеся к умолчанию, как это?

Похоже, это невозможно.

Одним из способов решения проблемы было бы использование триггера:

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» соответствуют этому вызову