簡體   English   中英

光標在觸發器中

[英]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 甚至擁有一個視圖似乎有點瑣碎。 例如,如果您有單獨的personperson_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM