检查约束违反时间

时间:2014-09-18 16:54:41

标签: sql oracle temporal

我的表定义

CREATE TABLE PROVISION_HIST
(
      card_nbr             number(9) primary key,
      provision_loc_cd          varchar2(2),
      start_ts                  timestamp(6),
      end_ts                    timestamp(6),
      last_updt_ts              timestamp(6),
      provision_meta_data       xmltype,
      unprovision_meta_data     xmltype,
      PERIOD FOR user_valid_time (start_ts, end_ts)
)
PARTITION BY RANGE (end_ts)
(  
   PARTITION PROVISION_HIST_P0 VALUES LESS THAN (TO_DATE('10-01-2014', 'MM-DD-YYYY')),
   PARTITION PROVISION_HIST_P1 VALUES LESS THAN (TO_DATE('11-01-2014', 'MM-DD-YYYY')),
   PARTITION PROVISION_HIST_P2 VALUES LESS THAN (TO_DATE('12-01-2014', 'MM-DD-YYYY')),
   PARTITION PROVISION_HIST_P3 VALUES LESS THAN (TO_DATE('01-01-2015', 'MM-DD-YYYY'))
);

CREATE UNIQUE INDEX provision_hist_pk 
   ON PROVISION_HIST (card_nbr, provision_loc_cd, start_ts);

我只需插入一些虚假数据进行测试。 我使用了

INSERT INTO provision_hist (CARD_NBR,PROVISION_LOC_CD, START_TS,END_TS,LAST_UPDT_TS,PROVISION_META_DATA,UNPROVISION_META_DATA)
VALUES (4444,'lx',to_timestamp( '03/18/2012 02:35 AM', 'MM/DD/YYYY HH:MI AM'),to_timestamp( '12/01/2014 02:35 AM', 'MM/DD/YYYY HH:MI AM'),current_timestamp(6),'<Warehouse whono="200"><Building>Leased</Building> </Warehouse>','<Warehouse whono="200"> <Building>Leased</Building> </Warehouse>'
);

ORA-02290:违反检查约束(USER_VALID_TIME793C79)

任何帮助都会很棒。

感谢。

2 个答案:

答案 0 :(得分:1)

您刚刚显示了与Oracle 12c的temporal validity功能Bug 18195286 : ORA-2290 ON INSERT INTO TABLE WITH TEMPORAL VALIDITY相关联的已知错误的变体。

具体来说,当一个人用PERIOD FOR子句改变或创建一个表时,会创建一个约束来验证该句号的日期:

PERIOD FOR user_valid_time (start_ts, end_ts)

可以通过查询user_constraints来显示创建的约束。它会显示:

SELECT search_condition
FROM user_constraints
WHERE table_name = 'PROVISION_HIST'

约束中的结果:

(start_ts < end_ts) and (VALID > 0) 

您的insert语句会因此约束而抛出错误。

Kim Berg Hansen早些时候发现了这一点,我只是引用了实际的错误。这被标识为已使用版本12.1.0.2修复。

答案 1 :(得分:-1)

通过查看插入部分,to_timestamp的AM正在困扰我。至少取出AM是因为它看起来像http://www.techonthenet.com/oracle/functions/to_timestamp.php,他们不会这样做。所以首先让我们拿出来。也许你也想把FOR改成AS。并且似乎user_valid_time是一个函数,因为它接受了参数,所以我建议找到这个函数并检查它的实现。 &#34; http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions231.htm&#34;