Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Триггер на представление ORACLE DB

Максим Лео Знаток (366), на голосовании 11 месяцев назад
Делаю БД с таблицами "Товары" и "Группы товаров", хочу сделать instead триггеры для представления. Но не знаю, как получить введенные в представление данные. Через NEW и OLD не получается. Как можно по-другому?
Ошибка в триггере:
PLS-00049: неверная переменная привязки ' NEW.GROUP _ID'
Представление:
  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_PRODUCT_VIEW"
INSTEAD OF INSERT ON PRODUCTS_VIEW
FOR EACH ROW
DECLARE
v_group_id NUMBER;
BEGIN
-- Получаем ID группы товара по имени
SELECT ID INTO v_group_id FROM "USER1"."PRODUCT_GROUP" WHERE ID = :NEW.GROUP_ID;

IF v_group_id IS NOT NULL THEN
-- Вставляем запись в таблицу "Товары" с вычисляемыми полями
INSERT INTO PRODUCT (NAME, GROUP_ID, ENTRY_PRICE, COUNT, RETAIL_PRICE)
VALUES (:NEW.NAME, v_group_id, :NEW.ENTRY_PRICE, :NEW.COUNT, :NEW.RETAIL_PRICE);

-- Обновляем вычисляемые поля и интегральные показатели
UPDATE "USER1"."PRODUCT_GROUP"
SET COUNT = (SELECT SUM(COUNT) FROM "USER1"."PRODUCT" WHERE GROUP_ID = v_group_id),
C_RETAIL = (SELECT SUM(COUNT * RETAIL_PRICE) FROM "USER1"."PRODUCT" WHERE GROUP_ID = v_group_id)
WHERE ID = v_group_id;
ELSE
-- Генерируем пользовательское исключение при неправильном вводе имени группы
RAISE_APPLICATION_ERROR(-20001, 'Группа товаров с указанным именем не существует.');
END IF;
END;
https://pastebin.com/BP9wG5Nn - полный код
Голосование за лучший ответ
iddimasik9821 Профи (521) 1 год назад
дружище, у тебя были вопросы по операционным системам, морской бой и две программы по синхронизации процессов, поделись решением по-братски по этой лабе
Максим ЛеоЗнаток (366) 11 месяцев назад
если еще нужно,могу скинуть
iddimasik9821 Профи (521) Максим Лео, хах, спасибо, уже и так сделал, воложу на гитхаб, пусть люди не страдают)
Похожие вопросы