Триггер на представление ORACLE DB
Делаю БД с таблицами "Товары" и "Группы товаров", хочу сделать instead триггеры для представления. Но не знаю, как получить введенные в представление данные. Через NEW и OLD не получается. Как можно по-другому?
CREATE OR REPLACE FORCE NONEDITIONABLE VIEW "USER1"."PRODUCTS_VIEW" ("Product_name", "Group_name", "Entry_price", "Product_count") AS
SELECT
p.NAME AS "Product_name",
pg.NAME AS "Group_name",
p.ENTRY_PRICE AS "Entry_price",
p.COUNT AS "Product_count"
FROM
PRODUCT p
JOIN
PRODUCT_GROUP pg ON p.GROUP_ID = pg.ID;
Триггер:
create or replace NONEDITIONABLE TRIGGER "USER1"."INSTEAD_OF_INSERT_PRODUCTS_VIEW"
INSTEAD OF INSERT ON PRODUCTS_VIEW
FOR EACH ROW
BEGIN
-- Вставляем данные в таблицу "PRODUCT" без дополнительных вычислений
INSERT INTO "USER1"."PRODUCT" (NAME, GROUP_ID, ENTRY_PRICE, COUNT)
VALUES (:NEW.Product_name, :NEW.Group_name, :NEW.Entry_price, :NEW.Product_count);
END;
Полный код:
CREATE TABLE "USER1"."PRODUCT"
( "ID" NUMBER(*,0) DEFAULT "USER1"."PRODUCT_SEQUENCE"."NEXTVAL" NOT NULL ENABLE,
"NAME" VARCHAR2(80 BYTE) NOT NULL ENABLE,
"GROUP_ID" NUMBER(*,0) DEFAULT 0 NOT NULL ENABLE,
"ENTRY_PRICE" NUMBER DEFAULT 0,
"RETAIL_PRICE" NUMBER DEFAULT 0,
"COUNT" NUMBER(*,0) DEFAULT 0 NOT NULL ENABLE,
CONSTRAINT "PRODUCT_PK" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "PRODUCT_FK1" FOREIGN KEY ("GROUP_ID")
REFERENCES "USER1"."PRODUCT_GROUP" ("ID") ON DELETE CASCADE ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
CREATE OR REPLACE NONEDITIONABLE TRIGGER "USER1"."UPDATE_GROUP_C_RETAIL"
BEFORE UPDATE OF entry_price ON product
FOR EACH ROW
BEGIN
UPDATE product_group
SET c_retail = c_retail - (:OLD.retail_price * :OLD.count) + (:NEW.retail_price * :NEW.count)
WHERE id = :NEW.group_id;
END;
/
ALTER TRIGGER "USER1"."UPDATE_GROUP_C_RETAIL" ENABLE;
Ответы (1 шт):
Автор решения: ESkri
→ Ссылка
Убери for each row
Документация говорит, что
An INSTEAD OF trigger is always a row-level trigger.