我有一个现有的TABLE 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。这可能不是您想要的,并且您可能会遇到违反约束的情况。您也没有设置计数器字段- 如果该字段不能为空,则将出错。但是您没有说出您正在得到什么错误,如果有的话。
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。
merge
但是我不喜欢这种模型,您正在通过同时修改基表来设置数据差异的可能性。试图保持这种计数不一定像看起来那样简单。
我通常希望将其设为一个视图,该视图将始终是最新的,并且不需要触发器来使事情变得复杂:
create view postn_matrix as select person_id, count(*) from basetable group by person_id;
当然,我可能会误解或简化了基表的功能以及所需的postn_matrix功能。拥有一个视图似乎有些琐碎。例如,如果您有单独的表person和person_position表,则可以添加外部联接以查看没有职位的人:
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;