2016-08-18 28 views
0

數據源:甲骨文:爲了實現列自動管理

username type rank 
a  106 1 
a  116 2 
a  126 3 
b  106 1 
b  106 2 

時刪除,116,2這個紀錄回報:

username type rank 
a  106 1 
a  126 2 
b  106 1 
b  106 2 

時插入,116回:

username type rank 
a  106 1 
a  126 2 
a  116 3 
b  106 1 
b  106 2 

我選擇使用tigger來實現:

插入(成功):

create or replace trigger bi_auto 
    before insert 
    on auto 
    for each row 
declare 
    -- local variables here 
begin 
    select count(rank)+1 into :new.rank from auto where username=:new.username; 
end bi_auto; 

刪除(失敗,返回ORA-04091,ORA-06512,ORA-04088):

create or replace trigger bd_auto 
    after delete 
    on auto 
    for each row 
declare 
    -- local variables here 
begin 
    insert into session_auto 
    select username, type, rank() over(partition by username order by rank) ranknew from auto where username=:old.username order by username; 
    delete from auto where username=:old.username; 
    insert into auto select * from session_auto; 
end bd_auto; 

請幫我修改了,謝謝知道有表現有問題,但我想知道如何去實現。

回答

0

我認爲整個方法有問題並且容易出錯。動態地計算等級會容易得多。如果您想查詢表的方便,你可以只將它添加到一個視圖:

CREATE OR REPLACE VIEW auto_view AS 
SELECT username, type, RANK() OVER (PARTITION BY username ORDER BY TYPE ASC) r 
FROM auto 

如果性能是什麼大問題,你總是可以materialize your view

+0

謝謝你的回答。如果使用視圖,我在插入或刪除時出現問題。示例:當我刪除'b,106,1'這條記錄時,我不知道是否沒有排名的文章要刪除。 – zhanzezhu

+0

@zhanzezhu在插入/刪除你只使用用戶名和類型。等級只是一個視覺(暗示人類)。 – user272735