【问题标题】:ORA-12899 after object table update对象表更新后 ORA-12899
【发布时间】:2011-11-01 14:02:14
【问题描述】:
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 手册中它是一个特性?

【问题讨论】:

    标签: oracle object ora-12899


    【解决方案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 中的一个错误。您没有运行最新版本的任何原因?

    【讨论】:

      猜你喜欢
      • 2022-07-07
      • 2015-02-19
      • 2016-09-15
      • 1970-01-01
      • 2021-05-09
      • 2023-03-23
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      相关资源
      最近更新 更多