在 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>
我觉得还不错。
我只是想计算和存储从 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>
我觉得还不错。