[英]Oracle create table with virtual column
我在Oracle(Oracle数据库11g企业版11.1.0.7.0版-64位生产)上运行此SQL:
CREATE TABLE R_SEQUENCES_COUNT1
(
DS_ID NUMBER,
LINE_TIME TIMESTAMP(6),
DAY_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME)),
HOUR_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME,'HH24')) ,
MINUTE_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME,'MI')) ,
SECOND_ID DATE GENERATED ALWAYS AS (LINE_TIME),
R_ID NUMBER,
SEQUENCE_ID NUMBER
)NOLOGGING
TABLESPACE TWC_DATA_SPACE
PARTITION BY LIST (DS_ID)
SUBPARTITION BY LIST(DAY_ID)
(PARTITION DS_ID_OTHER VALUES (DEFAULT)
(SUBPARTITION DS_ID_OTHER_DAY_ID_OTHER VALUES (DEFAULT)))
并得到这个错误:
Error at Command Line:8 Column:40
Error report:
SQL Error: ORA-54016: Invalid column expression was specified
怎么了?
根据需要将其用作日期,请使用:
SECOND_ID DATE GENERATED ALWAYS AS (cast(LINE_TIME as date)),
否则你可以做:
SECOND_ID TIMESTAMP GENERATED ALWAYS AS (LINE_TIME + numtodsinterval(0, 'day')),
但是在那种情况下,不确定为什么要使用该列的确切副本?
例如第二个:
SQL> CREATE TABLE R_SEQUENCES_COUNT1
2 (
3 DS_ID NUMBER,
4 LINE_TIME TIMESTAMP(6),
5 DAY_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME)),
6 HOUR_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME,'HH24')) ,
7 MINUTE_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME,'MI')) ,
8 SECOND_ID TIMESTAMP GENERATED ALWAYS AS (LINE_TIME+numtodsinterval(0, 'day')),
9 R_ID NUMBER,
10 SEQUENCE_ID NUMBER
11 )NOLOGGING
12 /
Table created.
SQL> insert into R_SEQUENCES_COUNT1 (ds_id, line_time) values (1, systimestamp);
1 row created.
SQL> @print_Table "select * from R_SEQUENCES_COUNT1"
DS_ID : 1
LINE_TIME : 14-mar-2013 09:56:31.104921
DAY_ID : 14-mar-2013 00:00:00
HOUR_ID : 14-mar-2013 09:00:00
MINUTE_ID : 14-mar-2013 09:56:00
SECOND_ID : 14-mar-2013 09:56:31.104921
R_ID :
SEQUENCE_ID :
-----------------
在您的创作中
//set condition is invalid
SECOND_ID DATE GENERATED ALWAYS AS (LINE_TIME)
// change to this...
SECOND_ID DATE GENERATED ALWAYS AS (TIMESTAMP)
数据类型TIMESTAMP
允许几分之一秒。 如果将其转换为DATE,则小数秒将被删除-例如
所以在选择第二个..
select cast(systimestamp as date) from dual;
我认为的另一种方式是...
是将时间戳记TRUNC()
为秒,您可以将其转换为日期
CAST( timestamp AS DATE)
然后像这样执行TRUNC:
TRUNC(CAST(timestamp AS DATE), 'YEAR')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.