我可以从Oracle中的表中选择值的修改版本吗?

时间:2015-07-09 19:39:59

标签: oracle triggers

我有一种奇怪的情况,在有限的时间内选择一个修改后的值而不是表中的实际值会很好。理想情况下,我想创建一个"触发器"将对所选值进行操作,然后当我不再需要触发器时,只需将其删除即可。

以下是一个例子:

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

这样的事情可能吗?

2 个答案:

答案 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;

希望这有帮助!!!