为视图创建触发器以编辑表的数据

时间:2014-06-01 09:33:52

标签: oracle view plsql triggers

我想问一下我的触发器查看有什么问题。 视图:

CREATE VIEW PRODUKT_VIEW  AS SELECT * FROM PRODUKT;

触发:

create or replace trigger dawka_zeruj
INSTEAD OF UPDATE ON PRODUKT_VIEW
DECLARE
begin
    if(:old.dawka = :new.dawka)
    then
    update produkt_view set dawka_l_p = null, dawka_j_p = null where bloz12=:old.bloz12;
    end if;
END;

执行后,sql开发人员要求参数..我认为:旧的,:新的是更新的参数,但似乎不是..我做错了什么?

PS。如果有人在更新时更改列“dawka”,我想设置2列:“dawka_l_p”和“dawka_j_p”为null。就这样。 Bloz12是PRIMARY KEY。

PS2。 dawka是varchar2列,所以它可能应该是if(:old.dawka like:new.dawka),但它仍然不起作用。

表的定义:

CREATE TABLE PRODUKT 
(
  BLOZ7 NUMBER 
, BLOZ12 NUMBER 
, NAZWA VARCHAR2(100 BYTE) 
, NAZWA_MIEDZ VARCHAR2(100 BYTE) 
, DAWKA VARCHAR2(70 BYTE) 
, DAWKA_ZLOZ VARCHAR2(1 BYTE) 
, DAWKA_L_P FLOAT(126) 
, DAWKA_J_P VARCHAR2(50 BYTE) 
, DAWKA_L_R FLOAT(126) 
, DAWKA_J_R VARCHAR2(50 BYTE) 
, DAWKA_L_N FLOAT(126) 
, DAWKA_J_N VARCHAR2(50 BYTE) 
, POSTAC VARCHAR2(70 BYTE) 
, OPAKOWANIE VARCHAR2(70 BYTE) 
, PODMIOT_ODP VARCHAR2(100 BYTE) 
, PODMIOT_ODP_KRAJ VARCHAR2(40 BYTE) 
, NAZWA_PELNA VARCHAR2(310 BYTE) 
, OPAK_NAJM_ZAREJ VARCHAR2(70 BYTE) 
, TEMP_OD FLOAT(126) 
, TEMP_DO FLOAT(126) 
, CENY_ID NUMBER 
, WYTWORCA_ID NUMBER 
) 
LOGGING 
TABLESPACE "USERS" 
PCTFREE 10 
INITRANS 1 
STORAGE 
( 
  INITIAL 65536 
  NEXT 1048576 
  MINEXTENTS 1 
  MAXEXTENTS 2147483645 
  BUFFER_POOL DEFAULT 
);

ALTER TABLE PRODUKT
ADD CONSTRAINT PRODUKT_CENY_URZEDOWE FOREIGN KEY
(
  CENY_ID 
)
REFERENCES CENY_URZEDOWE
(
  ID 
)
ENABLE;

ALTER TABLE PRODUKT
ADD CONSTRAINT PRODUKT_WYTWORCA FOREIGN KEY
(
  WYTWORCA_ID 
)
REFERENCES WYTWORCA
(
  ID 
)
ENABLE;

1 个答案:

答案 0 :(得分:0)

如评论中所述,您必须为两种情况指定完整更新声明。

create or replace trigger dawka_zeruj
INSTEAD OF UPDATE ON PRODUKT_VIEW    
DECLARE 
begin 
  if(:old.dawka <> :new.dawka) then 
     -- change the :new values, to re-use
     :new.dawka_l_p = null;
     :new.dawka_j_p = null;
  end if; 
  -- then the update can be done in any cases to your table.
  update produkt 
     set dawka_l_p = :new.dawka_l_p
       , dawka_j_p = :new.dawka_j_p
       , dawka     = :new.dawka 
   where bloz12=:old.bloz12; 
END;