【问题标题】:Create trigger for view to edit table's data为视图创建触发器以编辑表的数据
【发布时间】: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


【解决方案1】:

如 cmets 中所述,您必须为这两种情况指定完整的更新语句。

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多