[英]cursor in a trigger
我有一個現有的表postn_matrix
,其中包含員工列表及其postn_matrix
數。 組織中的職位。
每當添加或刪除用戶的職位時,此觸發器就會在表格中反映相應的計數(VIA UPDATE)
現在,如果有新用戶,那么他在postn_matrix
中將沒有條目,因此我必須為他/她(VIA INSERT)插入一條新記錄。 這需要從BASE TABLE中引入。
更新似乎工作正常,但我無法將新用戶加入表格。
我一直在嘗試使用游標處理這種情況。 但這還沒有任何幫助。 我希望一些專家可以向我展示光.. :)。 除了使用光標以外的任何其他建議將不勝感激
CREATE OR REPLACE TRIGGER TRIG1
BEFORE INSERT OR DELETE ON (BASETABLE)
FOR EACH ROW
DECLARE
cursor c1 is
select person_id
from postn_matrix;
v_temp varchar2(15);
BEGIN
IF INSERTING THEN
open c1;
LOOP
fetch c1 into v_temp;
if v_temp!=:new.person_id THEN
insert into POSTN_MATRIX (PERSON_ID)
VALUES (:new.PERSON_ID);
else
UPDATE POSTN_MATRIX
//this is working fine ;
END IF;
end loop;
close c1;
END
/
由於循環(缺少退出子句-希望您已經失去了將其轉換為問題的希望),您將嘗試為游標返回的每個記錄將一條記錄插入pstn_matrix
中,無論是否存在匹配項:new.person_id
; 如果匹配,您也將update
。 這可能不是您想要的,並且您可能會遇到違反約束的情況。 您也沒有設置計數器字段-如果該字段不可為空,則將出錯。 但是您沒有說出您正在得到什么錯誤,如果有的話。
如果您必須通過觸發器來執行此操作,則可以檢查是否有新人要排:
DECLARE
v_temp postn_matrix.person_id%TYPE;
BEGIN
IF INSERTING THEN
select max(person_id) into v_temp
from postn_matrix
where person_id = :new.person_id;
if v_temp is null then
-- no record found, so insert one
insert into postn_matrix (person_id, position_count)
values (:new.person_id, 1);
else
-- record exists, so update
update postn_matrix ...
end if;
...
...或使用merge
。
但是我不喜歡這種模型,並且您正在通過同時修改基表來設置數據差異的可能性。 試圖保持這種計數不一定像看起來那樣簡單。
我通常希望將其設為一個視圖,該視圖將始終是最新的,並且不需要觸發器使事情變得復雜:
create view postn_matrix as
select person_id, count(*)
from basetable
group by person_id;
當然,我可能會誤解或簡化了基表的功能以及postn_matrix
需要的postn_matrix
。 甚至擁有一個視圖似乎有點瑣碎。 例如,如果您有單獨的person
和person_position
表,則可以添加外部person_position
以查看沒有職位的人:
create view postn_matrix as
select p.person_id, count(pp.position_id)
from person p
left join person_position pp on pp.person_id = p.person_id
group by p.person_id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.