1
UPDATE ta_1 SET v_1 = 'new value' WHERE v_1 = 'value';
UPDATE ta_1 SET v_1 = 'newest value';

このテーブルで実行すると、最初の更新クエリは例外ORA-12899を返し、2番目は例外を返しません。

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-XE10g2でテスト済み。それはバグですか、それとも一部のOracleマニュアルには、機能であると書かれていますか?

4

1 に答える 1

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 のバグである可能性があります。最新バージョンを実行していない理由はありますか?

于 2011-11-01T15:14:57.227 に答える