2017-01-04 49 views
1

我想要拿出一個觸發器來填充插入/更新的行的列,這個分數取決於同一行的其他列上的數值。從插入的行中的其他數據填充列

例如

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

這是我要插入的行,我想,以填補col6使用其他列的值來計算的得分

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

我能做到這一點通過觸發器或程序?我應該在插入之前還是之後執行此操作?

+4

哪個版本的Oracle?從11g開始,您可以使用虛擬列。否則,您可以擁有一個可以進行計算的視圖。實際上,存儲派生數據只是複製了您已有的數據;而且您還需要定義如果其他值發生了變化會發生什麼情況 - 您是否計劃在此情況下更新col6? –

+3

另外,如果您嘗試更新其中一列,會發生什麼情況?這是否改變col6的價值? – GurV

回答

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; 
+0

謝謝,它幫助了很多 –

5

對於Oracle 11g中,您可以使用虛擬列:

甲骨文設置

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 
+0

出於好奇,如果表達式是拋出錯誤,比如說除以零,那麼會發生什麼?該行是插入還是更新? – GurV

+1

該行將無異常插入,然後選擇查詢將拋出一個'ORA-01476:除數等於零'異常 - 如果發生這種情況,則向表中添加檢查約束,以防止它插入行任何除數值將爲零。 – MT0

+0

不錯!感謝您的解釋。 +1 – GurV

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; 
相關問題