在 Oracle Sql 开发人员中计算和存储派生属性

Calculating and store derived attribute in Oracle Sql Developer

我只是想计算和存储从 dob(出生日期)派生的年龄属性。我如何在 Oracle SQL Developer 中做到这一点?

CREATE TABLE Patient (
dob DATE,
age NUMBER(3));

我的意思是当 de dob 像那样插入 01/01/2000 时,年龄将自动计算为 21。

不,您打算以错误的方式进行。 为什么你会非常想这样做?

这与填写个人资料的人说“我有 5 年的 Oracle 经验”是一样的。这在撰写该文本时可能是正确的,但是 - 现在仍然有效吗?两年后应该是“我有7年的经验了”。

那么,什么样的信息会将固定年龄存储到该列中?那个人在插入的那一刻21岁,但他们不会永远年轻。相信我,我知道。


系统建议您创建一个虚拟列。好吧,你不能。为什么?因为 - 为了计算某人的年龄 - 你必须参考今天的日期。 return是SYSDATE的函数。运气不好 - 它不是确定性的,这意味着每次使用相同的参数调用它时它都不会 return 相同的值。它不接受任何东西,这是真的,但没关系。如果你尝试它,它会失败:

SQL> create table patient
  2    (id             number constraint pk_pat primary key,
  3     date_of_birth  date not null,
  4     age            number generated always as
  5                      (round(months_between(sysdate, date_of_birth)/12, 0))
  6                      virtual
  7    );
                    (round(months_between(sysdate, date_of_birth)/12, 0))
                                          *
ERROR at line 5:
ORA-54002: only pure functions can be specified in a virtual column expression


SQL>

那么,您可以做什么?您可以创建视图。

SQL> create table patient
  2    (id             number constraint pk_pat primary key,
  3     date_of_birth  date not null
  4    );

Table created.

SQL> create or replace view v_patient as
  2    select id,
  3           date_of_birth,
  4           round(months_between(sysdate, date_of_birth)/12, 0) as age
  5    from patient;

View created.

SQL>

我们来测试一下。

SQL> insert into patient (id, date_of_birth) values (1, date '2000-01-01');

1 row created.

SQL> select * from v_patient;

        ID DATE_OF_BI        AGE
---------- ---------- ----------
         1 01.01.2000         21

SQL>

我觉得还不错。