我有一个现有的TABLE postn_matrix
,其中包含员工列表和他们的resp计数。在组织中的职位。
无论何时添加或删除用户的位置,相应的计数都会反映在表格'此触发器(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
/
答案 0 :(得分:4)
由于循环(缺少一个退出子句 - 希望你刚刚丢失了将其翻译成一个问题),你将尝试将记录插入pstn_matrix
每个< / em>记录光标返回,是否有匹配的: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
的内容。即使作为一种观点,似乎也有点微不足道。如果您有单独的person
和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;