检查约束违反时间

问题描述:

我的表定义检查约束违反时间

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)违反

任何帮助将是巨大的。

谢谢。

+0

是user_valid_time的一个函数吗? – Rika 2014-09-18 17:09:21

+0

@Rika它看起来只是用户定义的期限数据类型名称给我。 – user2711819 2014-09-18 17:12:37

+0

也是这个Oracle或SQL? – Rika 2014-09-18 18:30:38

您刚刚显示了与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语句中抛出这一限制的错误。

金伯格汉森先前确定了这一点,我只是列举了实际的错误。这被确定为在版本12.1.0.2中修复。

+1

这就是我正在考虑的错误,是的。我的问题是,虚拟无形列“VALID”在我的环境中始终具有负值。 – 2014-09-19 06:05:32

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