我想问一下我的触发器查看有什么问题。 视图:
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;
答案 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;