2011-11-01 73 views
1
UPDATE ta_1 SET v_1 = 'new value' WHERE v_1 = 'value'; 
UPDATE ta_1 SET v_1 = 'newest value'; 

首先更新查询后返回异常ORA-12899和第二并不时在此表中执行: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 Error: ORA-12899: value too large for column "TA_1"."V_2" (actual: 1, maximum: 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的错误。任何你没有运行最新版本的原因?