【发布时间】:2014-06-01 09:33:52
【问题描述】:
我想问一下我的视图触发器有什么问题。 查看:
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 开发人员要求提供参数。我认为 :old, :new 是更新的参数,但似乎不是。我做错了什么?
PS。如果有人在更新时更改列“dawka”,我想设置 2 列:“dawka_l_p”和“dawka_j_p”为空。就这样。 Bloz12 是主键。
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;
【问题讨论】:
-
在触发器中,是否打算再次更新视图:
update produkt_view set dawka_l_p =...。不应该是:update produkt set dawka_l_p = ...吗? -
好的,我发现了另一件事:我应该“将其作为脚本运行”而不是“语句”(来自 sql developer)。我已将 produkt_view 更改为 produkt 但它仍然无法正常工作..
-
可以添加
produkt表的定义吗? -
在 SQL Developer 中我没有收到任何错误或提示,并且运行良好 as a SQl Fiddle。
-
您必须为两个分支指定完整的更新语句。这里最简单的方法可能是更改
if中的:new值,然后使用所有:new值更新真实表。或者,您可以拥有从:new值设置的记录类型,更改if,然后用于真正的更新。你想要!=而不是not like。不知道为什么在这种情况下你想要在视图而不是表上触发。
标签: oracle view plsql triggers