Максим Лео
Знаток
(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;
дружище, у тебя были вопросы по операционным системам, морской бой и две программы по синхронизации процессов, поделись решением по-братски по этой лабе
Ошибка в триггере:
PLS-00049: неверная переменная привязки ' NEW.GROUP _ID'
Представление: Триггер: https://pastebin.com/BP9wG5Nn - полный код