簡體   English   中英

虛擬列定義引用另一個虛擬列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM