我试图想出一个触发器来填充我插入/更新的行的列,其得分取决于该行的其他列上的数值。
例如
+------+------+------+------+------+------+
| col1 | col2 | col3 | col4 | col5 | col6 |
+------+------+------+------+------+------+
| 1 | 2 | 1 | 3 | 1 | |
+------+------+------+------+------+------+
这是我要插入的行,我想用col6
填充使用其他列的值计算的分数
(100 - avg(col1:col5)/4*100)
我可以通过触发器或程序执行此操作吗?我应该在插入之前或之后这样做吗?
答案 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;