根据列中的值为sysdate添加天数

时间:2017-10-03 08:28:20

标签: oracle-sqldeveloper

我正在尝试根据当前构建的视图表创建手动表。 该当前表的结构如下:

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

1 个答案:

答案 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>