[英]Virtual column definition referring to another virtual column
是否可以擁有一個虛擬列,其列表達式定義引用另一個虛擬列,該列先前已在表上定義? 列表達式的文檔說:
定義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
我正在嘗試做什么?
不,雖然列表達式的文檔沒有明確說明你不能。 但是,此限制顯示在My Oracle Support文檔466916.1中,並在create table
文檔中 :
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
視圖也不能引用自己的列,因此您仍需要在基表中添加和減少。 您還可以在視圖上使用instead-of
觸發器 ,以便嘗試修改視圖實際上會更改基表,這將使其更加用戶友好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.