是否可能有一个虚拟列,其列表达式定义引用了以前在表上定义的另一个虚拟列?列表达式的文档说:
定义column_expression必须仅引用已在当前语句或先前语句中定义的主题表的列。
这是一个简单的示例,说明了我要做的事情,第三个虚拟列指的是已经定义的其他虚拟列:
create table numberManipulation
(
value1 VARCHAR2 (10),
Value2 VARCHAR2 (10),
Addition AS (DECODE (value1, 'late', 1, 0) + DECODE (value2, 'late', 1, 0)),
subtraction AS(DECODE (value1, 'present', 1, 0) + DECODE (value2, 'present', 1, 0)),
Compile AS (ADDITION + SUBTRACTION)
);
但这会导致错误:
ORA-54012: virtual column is referenced in a column expression
我想做的事有可能吗?
发布于 2016-03-18 14:26:23
不,虽然列表达式的文档没有明确表示不能。但是,我的Oracle文档466916.1和文档中都显示了这个限制
AS子句中的column_expression具有以下限制:
您必须从第三个虚拟列中的每个虚拟列重复计算:
create table numberManipulation
(
value1 VARCHAR2 (10),
Value2 VARCHAR2 (10),
Addition AS (DECODE (value1, 'late', 1, 0) + DECODE (value2, 'late', 1, 0)),
subtraction AS(DECODE (value1, 'present', 1, 0) + DECODE (value2, 'present', 1, 0)),
Compile AS (DECODE (value1, 'late', 1, 0) + DECODE (value2, 'late', 1, 0)
+ DECODE (value1, 'present', 1, 0) + DECODE (value2, 'present', 1, 0))
);
Table NUMBERMANIPULATION created.
或者稍微简单一点:
Compile AS (DECODE (value1, 'late', 1, 'present', 1, 0)
+ DECODE (value2, 'late', 1, 'present', 1, 0))
..。尽管您可能更愿意保持两个较长的表达式与前面的列匹配,以保持一致性和维护性。
让一个虚拟列引用另一个列将规定它们必须计算的顺序,并可能导致循环依赖。
另一种方法是有一个视图,该视图从基表中的两个虚拟列计算最后一列:
create table numberManipulation
(
value1 VARCHAR2 (10),
Value2 VARCHAR2 (10),
Addition AS (DECODE (value1, 'late', 1, 0) + DECODE (value2, 'late', 1, 0)),
subtraction AS(DECODE (value1, 'present', 1, 0) + DECODE (value2, 'present', 1, 0))
);
Table NUMBERMANIPULATION created.
create view vNumberManipulation as
select numberManipulation.*, addition + subtraction as compile
from numberManipulation;
View VNUMBERMANIPULATION created.
insert into numberManipulation (value1, value2) values ('late', 'late');
insert into numberManipulation (value1, value2) values ('late', 'present');
insert into numberManipulation (value1, value2) values ('present', null);
select * from vNumberManipulation;
VALUE1 VALUE2 ADDITION SUBTRACTION COMPILE
---------- ---------- ----------- ------------ ------------
late late 2 0 2
late present 1 1 2
present 0 1 1
视图也不能引用自己的列,因此仍然需要基表中的加法和减法。您还可以在视图上设置一个触发器,这样试图修改视图实际上会更改基表,这将使其更加方便用户。
https://stackoverflow.com/questions/36086816
复制相似问题