我有一种奇怪的情况,在有限的时间内选择一个修改后的值而不是表中的实际值会很好。理想情况下,我想创建一个"触发器"将对所选值进行操作,然后当我不再需要触发器时,只需将其删除即可。
以下是一个例子:
CREATE TABLE FOO (
FOO_ID NUMBER NOT NULL PRIMARY KEY,
SOME_VAL NUMBER
);
INSERT INTO FOO (FOO_ID, SOME_VAL) VALUES (1, 236);
/* Some code that will create the "trigger" which adds 4 to SOME_VAL when selected... */
SELECT * FROM FOO;
输出:
FOO_ID | SOME_VAL
-------+---------
1 | 240
这样的事情可能吗?
答案 0 :(得分:1)
我不会用触发器来解决这个问题。相反,我会添加一个默认为SYSDATE
的CREATED列。该列设置为插入行的时间。
CREATE TABLE FOO (
FOO_ID NUMBER NOT NULL PRIMARY KEY,
SOME_VAL NUMBER,
CREATED TIMESTAMP NOT NULL DEFAULT SYSDATE
);
插入语句保持不变。您不应该明确设置CREATED:
INSERT INTO FOO (FOO_ID, SOME_VAL) VALUES (1, 236);
选择类似。不同之处在于,我们现在创建一个视图,而不是触发器,我们从中选择适应的值。
SELECT * FROM FOO_VIEW;
可以按如下方式创建视图:
CREATE VIEW FOO_VIEW AS
SELECT FOO_ID,
CASE
WHEN SYSDATE < CREATED + 1 THEN SOME_VAL + 4
ELSE SOME_VAL
END SOME_VAL
FROM FOO
特殊条件包含在案例陈述中。不需要触发器,只创建了一个视图。
答案 1 :(得分:1)
我认为这也可以使用虚拟列来完成,例如您已根据您的要求简单地ALTER
分享了表格定义的值。
ALTER TABLE FOO ADD MOD_VAL GENERATED ALWAYS AS (SOME_VAL + 4);
一旦你改变了定义就像往常一样插入你的记录(记住虚拟列你还需要在插入记录时提到字段名称)
INSERT INTO FOO (FOO_ID,SOME_VAL) VALUES (1,236);
现在,您可以使用旧的SQL SELECT
语句选择结果。
SELECT FOO_ID, MOD_VAL FROM FOO;
希望这有帮助!!!