Как создать триггер с указанным ниже описанием проблемы? - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь создать триггер с именем transaction_type_af_insert, который запускается всякий раз, когда новая запись вставляется в таблицу ransaction_type. Этот триггер вставит новый тип и действие в таблицу transaction_type_log_history после вставки деталей типа транзакции. Имя действия в затронутой таблице журнала transaction_type_log_history - «After_Insert_transaction_type».

Но возникает ошибка ниже:

Warning: Trigger created with compilation errors.
insert into transaction_type(id,type)values(22,'Credit Card')
            *
ERROR at line 1:
ORA-04098: trigger 'P12097.TRANSACTION_TYPE_AF_INSERT' is invalid and failed
re-validation

Пожалуйста, помогите мне решить проблему

CREATE TRIGGER transaction_type_af_insert
AFTER INSERT 
ON transaction_type FOR EACH ROW
DECLARE
type varchar(30)
action varchar(30)
BEGIN
UPDATE transaction_type_log_history
SET action = 'After_Insert_transaction_type'
    WHERE transaction_type.id = transaction_type_log_history.id;
END;

1 Ответ

0 голосов
/ 04 августа 2020

Вы можете запросить представление user_errors, чтобы увидеть, что на самом деле не так; некоторые клиенты позволяют использовать show errors в качестве ярлыка после создания объекта (SQL Developer, SQLcl, SQL* Plus ..) и просмотра сообщения «Предупреждение: триггер создан с ошибками компиляции». С вашим текущим кодом, который будет выглядеть примерно так:

PLS-00103: обнаружен символ "(" при ожидании одного из следующих значений:

; authid по умолчанию как принудительное при доступе

type - это зарезервированное слово , поэтому вы не можете использовать его для имени локальной переменной - он ожидает, что вы объявляете тип записи. Изменение имени переменная показывает следующую ошибку:

PLS-00103: Обнаружен символ «ДЕЙСТВИЕ» при ожидании одного из следующих значений:

: =; не нулевой символ по умолчанию

, потому что у вас нет точек с запятой после ваших объявлений.

Исправление, которое по-прежнему получает 'ORA-00904: «TRANSACTION_TYPE». «ID»: недопустимый идентификатор », потому что в вашем операторе обновления нет включить таблицу transaction_type. Вы можете использовать корреляционные имена для ссылки на данные в исходной инструкции строки таблицы, для которой сработал триггер, используя :new по умолчанию; теперь это компилируется:

CREATE OR REPLACE TRIGGER transaction_type_af_insert
AFTER INSERT ON transaction_type
FOR EACH ROW
DECLARE
  l_type varchar2(30);
  l_action varchar2(30);
BEGIN
  UPDATE transaction_type_log_history
  SET action = 'After_Insert_transaction_type'
  WHERE transaction_type_log_history.id = :new.id;
END;
/

db <> fiddle

Фактически вы не используете ни одну из двух локально объявленных переменных, поэтому вы можете удалить их и ключевое слово declare.

Кажется, вы также пытаться обновить таблицу истории вместо того, чтобы вставлять туда новую строку, что, по-видимому, предлагает вам сделать это в формулировке задачи.

...