Arhn - архитектура программирования

Триггер оператора Oracle не может получить доступ к значениям таблицы

При попытке получить доступ к значениям таблицы внутри моего триггера оператора я получаю следующий идентификатор ошибки: XXX должен быть объявлен.

Таблица

CREATE TABLE testTable(
   id INT,
   store INT,
   amount NUMBER
);

Триггер

CREATE OR REPLACE TRIGGER test_trigger
    AFTER INSERT OR UPDATE ON testTable
    DECLARE
       myID INT;
       myStore INT;
    BEGIN
        myID := id;
        myStore := store;

      IF amount < 3 THEN
         DBMS_OUTPUT.PUT_LINE('DANGER');
      END IF;

    END;

Ошибка

PLS-00201: ID 'id' must be declared
PLS-00201: ID 'store' must be declared
PLS-00201: ID 'amount' must be declared

Я новичок в оракуле pl/sql и триггерах и понятия не имею, как это решить.

25.05.2021

  • Вы бы хотели :new.id или :old.id:new.store или :old.store и :new.amount или :old.amount) в зависимости от того, пытаетесь ли вы получить старое значение или новое значение. Поскольку это триггер insert or update, я предполагаю, что вы хотите, чтобы значения были вставлены и значения, которые оператор update обновляет в строке, поэтому вы хотите использовать псевдозапись :new. 25.05.2021
  • Вы имеете в виду имена столбцов таблицы, но триггер оператора не знает, о каких данных строки вы говорите (или даже о какой таблице, поскольку у него нет контекста для того, какими должны быть эти идентификаторы). Если вы хотите сослаться на вставляемую строку, у вас должен быть триггер на уровне строки; но вы, кажется, намеренно создали уровень заявления. 25.05.2021
  • Но когда я использую триггер строки, я не могу обновить саму таблицу из-за проблемы с изменяющейся таблицей. 25.05.2021
  • @Andrew - вы можете изменить данные в строке, которая должна быть вставлена ​​/ обновлена, до ... для каждого триггера строки, назначив значения идентификаторам :new.xxx. Это не то же самое, что выполнение оператора update в теле триггера. Возможно, это было похоже. Хотя вопрос вроде не в этом... 25.05.2021
  • Но что, если я хочу написать что-то вроде: если сумма ‹ 3, то ОБНОВИТЬ test_table SET сумма = 5. Будет ли это работать? Написание этого дало мне проблему с мутирующей таблицей 25.05.2021
  • Если вы собираетесь обновить таблицу, а не изменить только изменяемую строку, вы не сможете использовать триггер на уровне строки и не будете иметь доступа к измененным значениям. Вы можете создать составной триггер с частью уровня строки, которая записывает данные уровня строки в коллекцию, и частью уровня оператора, которая читает коллекцию. Но это приличный уровень сложности. Возможно, вам просто нужен триггер уровня строки, который изменяет поле :new.amount изменяемой строки. 25.05.2021
  • @Andrew Эндрю - вы действительно хотите обновить каждую строку в таблице до 5 на основе значения одной вставляемой/обновляемой строки? Это кажется маловероятным. if :new.amount < 3 then :new.amount := 5; end if; повлияет только на эту строку. 25.05.2021
  • Обратите внимание, что если вы хотите изменить новые значения, вам понадобится триггер перед вставкой на уровне строки. Триггер после вставки не может изменять новые значения. 25.05.2021
  • @AlexPoole Да, вы правы, я не хочу обновлять каждую строку, а только те, которые затронуты. Но запись :new.amount := 5 не работает, потому что вы не можете обновить новые или старые значения. Какая будет альтернатива. 25.05.2021
  • @Andrew Эндрю - как я уже сказал, вам нужен триггер before, а не триггер after. Затем вы можете обновить новые значения. 25.05.2021
  • Что ж, похоже, я собираюсь изменить триггер после на триггер до. 25.05.2021

Ответы:


1

потребности :new для новой или обновленной записи Попробуйте это.

CREATE OR REPLACE TRIGGER test_trigger
    AFTER INSERT OR UPDATE
    ON testTable
DECLARE
    myID      INT;
    myStore   INT;
BEGIN
    myID := :new.id;
    myStore := :new.store;
    IF :new.amount < 3
    THEN
        DBMS_OUTPUT.PUT_LINE ('DANGER');
    END IF;
END;


  
01.06.2021
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..