我正在尝试根据当前构建的视图表创建手动表。 该当前表的结构如下:
ID | Column1 | Column2 | Buffer Days 1 | Asdf | Asdf1 | 91 2 | Qwert | Qwert1 | 11 3 | Zxcv | Zxcv1 | 28
目标是在Buffer Days之后添加第4列,列出sys日期+缓冲区天数
结果如下:
ID | Column1 | Column2 | Buffer Days | Lookout Date 1 | Asdf | Asdf1 | 91 | 02-Jan-18
答案 0 :(得分:0)
该要求闻起来像虚拟列候选者。但是,它不起作用:
SQL> create table test
2 (id number,
3 column1 varchar2(10),
4 buffer_days number,
5 --
6 lookout_date as (SYSDATE + buffer_days) --> virtual column
7 );
lookout_date as (SYSDATE + buffer_days)
*
ERROR at line 6:
ORA-54002: only pure functions can be specified in a virtual column expression
显然,SYSDATE是一个非确定性函数(调用时不返回相同的值)。
为什么不在现有表格中使用“普通”列?因为您不应存储使用其他表列计算的值。例如,好的旧Scott的EMP表包含SAL和COMM列。它不(也不应该)包含TOTAL_SAL列(作为SAL + COMM),因为 - 当SAL和/或COMM更改时,您还必须记住更新TOTAL。
因此,视图可以提供帮助。例如:
SQL> create table test
2 (id number,
3 column1 varchar2(10),
4 buffer_days number
5 );
Table created.
SQL> create or replace view v_test as
2 select id,
3 column1,
4 buffer_days,
5 sysdate + buffer_days lookout_date
6 from test;
View created.
SQL> insert into test (id, column1, buffer_days) values (1, 'asdf', 5);
1 row created.
SQL> select sysdate, v.* from v_test v;
SYSDATE ID COLUMN1 BUFFER_DAYS LOOKOUT_DA
---------- ---------- ---------- ----------- ----------
23.12.2017 1 asdf 5 28.12.2017
SQL>