如何使用虚拟列执行 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,仅代表您要显示的逻辑。
在我的 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,仅代表您要显示的逻辑。