如何使用虚拟列执行 SQL-INSERT/UPDATE

How can I perform a SQL-INSERT/UPDATE with a virtual column

在我的 oracle 应用程序中,我使用了三列并将它们在我的 SQL 查询中连接到产品编号:

SELECT id_part1 || '.' || id_part2 || '.' || id_part3 as product_number
FROM table

但是由于虚拟列,我无法执行任何更新或插入查询。我如何执行这些操作,以便将虚拟列分解为三个原始列并正确保存每个值。

非常感谢

杰克

product_number 列在 table 中不存在,因此您不能 UPDATE 也不能 INSERT

但我认为您可以使用一个简单的技巧来绕过这个问题,您可以尝试向 table 添加一个物理列 product_number,然后添加一个 BEFORE UPDATE 触发器

CREATE OR REPLACE TRIGGER CalculatedColumnSplit
    BEFORE 
    INSERT OR UPDATE 
    ON myTable
    FOR EACH ROW
DECLARE
   
BEGIN
    :new.id_part1 := regexp_substr(:new.product_number,'[^.]+', 1, 1);
    :new.id_part2 := regexp_substr(:new.product_number,'[^.]+', 1, 2);
    :new.id_part3 := regexp_substr(:new.product_number,'[^.]+', 1, 3);
    :new.product_number := NULL;
END;

据我从评论和问题中了解到,您关心的是一个普通的字符串类型列product_number,需要用点将其拆分为其他列。然后您可以根据需要添加虚拟列,如下所示

ALTER TABLE t
ADD (
    id_part1 AS (REGEXP_SUBSTR(product_number,'[^.]+',1,1)),
    id_part2 AS (REGEXP_SUBSTR(product_number,'[^.]+',1,2)),
    id_part3 AS (REGEXP_SUBSTR(product_number,'[^.]+',1,3))
);

那些新添加的列将完全依赖product_number列,不会在相关段内额外占用space,仅代表您要显示的逻辑。

Demo