ORA-12899 после обновления таблицы объектов
UPDATE ta_1 SET v_1 = 'new value' WHERE v_1 = 'value';
UPDATE ta_1 SET v_1 = 'newest value';
Первый запрос на обновление возвращает исключение ORA-12899, а второй - на выполнение этой таблицы:
CREATE OR REPLACE type t_2 AS object
(v_1 VARCHAR2 (4000));
CREATE OR REPLACE type t_1 AS object
(
v_1 VARCHAR2 (4000),
v_2 t_2);
CREATE TABLE ta_1 OF t_1
(CHECK (v_2 IS NULL OR (v_2.v_1 = 'uFonec')) ENABLE
) ;
CREATE OR REPLACE TRIGGER ta_1_tr BEFORE
INSERT OR
UPDATE ON ta_1 FOR EACH ROW DECLARE BEGIN IF :new.v_2 IS NULL THEN :new.v_2 := NEW t_2 ('uFonec') ;
END IF;
END;
INSERT INTO ta_1 VALUES (t_1 ('value', NULL) ) ;
Первый запрос на обновление возвращает:
Ошибка SQL: ORA-12899: слишком большое значение для столбца "TA_1"."V_2" (фактическое значение: 1, максимальное значение: 0)
При отключенном ограничении на таблицу оба запроса на обновление работают. Проверено на Oracle-XE 10g2. Это ошибка или в руководстве Oracle написано, что это особенность?
1 ответ
Выполнение этого на Oracle 11gR2 EE (с включенным ограничением):
SQL> INSERT INTO ta_1 VALUES (t_1 ('other value', t_2 ('blah')) ) ;
INSERT INTO ta_1 VALUES (t_1 ('other value', t_2 ('blah')) )
*
ERROR at line 1:
ORA-02290: check constraint (APC.SYS_C0021529) violated
SQL> UPDATE ta_1 SET v_1 = 'new value' WHERE v_1 = 'value';
1 row updated.
SQL> UPDATE ta_1 SET v_1 = 'newest value';
1 row updated.
SQL>
Так что, возможно, это ошибка в XE. Любая причина, почему вы не используете последнюю версию?