从插入的行中的其他数据填充列

时间:2017-01-04 12:32:58

标签: sql oracle

我试图想出一个触发器来填充我插入/更新的行的列,其得分取决于该行的其他列上的数值。

例如

+------+------+------+------+------+------+
| col1 | col2 | col3 | col4 | col5 | col6 |
+------+------+------+------+------+------+
| 1    | 2    | 1    | 3    | 1    |      |
+------+------+------+------+------+------+

这是我要插入的行,我想用col6填充使用其他列的值计算的分数

(100 - avg(col1:col5)/4*100)

我可以通过触发器或程序执行此操作吗?我应该在插入之前或之后这样做吗?

3 个答案:

答案 0 :(得分:5)

从Oracle 11g开始,您可以使用虚拟列:

Oracle安装程序

CREATE TABLE table_name (
  col1 NUMBER,
  col2 NUMBER,
  col3 NUMBER,
  col4 NUMBER,
  col5 NUMBER,
  col6 NUMBER GENERATED ALWAYS AS ( 100 - (col1+col2+col3+col4+col5)*5 ) VIRTUAL
);

INSERT INTO table_name ( col1, col2, col3, col4, col5 )
  VALUES ( 1, 2, 1, 3, 1 );

<强>查询

SELECT * FROM table_name;

<强>输出

COL1 COL2 COL3 COL4 COL5 COL6
---- ---- ---- ---- ---- ----
   1    2    1    3    1   60

答案 1 :(得分:1)

触发器看起来像。

CREATE OR REPLACE TRIGGER ti
 BEFORE UPDATE OR INSERT ON yourtable
 FOR EACH ROW
BEGIN
   :new.col6 := 
      (  100
       -   (:new.col1 + :new.col2 + :new.col3 + :new.col4 + :new.col5)/ 5 * 100);
end;

答案 2 :(得分:0)

我这样做是为了避免可能存在的空值。谢谢大家的宝贵帮助。

create or replace TRIGGER SCORE_SYMP_TRG 
BEFORE INSERT OR UPDATE ON KOOS 
FOR EACH ROW
DECLARE
BEGIN



  :NEW.SCORE_SYMP := 100 - ROUND(((NVL(:NEW.S1,0) + NVL(:NEW.S2,0) + NVL(:NEW.S3,0) + NVL(:NEW.S4,0) + NVL(:NEW.S5,0) + NVL(:NEW.R6, 0) + NVL(:NEW.R7, 0))/(
                        NVL((NVL(:NEW.S1,0)/NVL(:NEW.S1,1)),0) + NVL((NVL(:NEW.S2,0)/NVL(:NEW.S2,1)),0) + NVL((NVL(:NEW.S3,0)/NVL(:NEW.S3,1)),0) + NVL((NVL(:NEW.S4,0)/NVL(:NEW.S4,1)),0)
                        + NVL((NVL(:NEW.S5,0)/NVL(:NEW.S5,1)),0) + NVL((NVL(:NEW.R6,0)/NVL(:NEW.R6,1)),0) + NVL((NVL(:NEW.R7,0)/NVL(:NEW.R7,1)),0)) /4)*100,0);


END;