CREATE OR REPLACE TRIGGER tr_or_cl_sup_line
BEFORE UPDATE OF line_num
ON line
FOR EACH ROW
DECLARE
n_out NUMBER;
n_seqnum NUMBER;
CURSOR cur_cmpnt (c_lineid NUMBER)
IS
SELECT cmpnt_id
FROM component
WHERE line_id = c_lineid;
n_cmpntid NUMBER;
v_inuser VARCHAR2 (30);
BEGIN
p_pause_triggers (n_out);
IF n_out = 1
THEN
RETURN;
END IF;
n_out := 0;
SELECT user_name
INTO v_inuser
FROM current_info
WHERE session_id = USERENV ('SESSIONID');
IF f_etf_check = 'Y'
THEN
p_or_sup ('TR_OR_CL_SUP_line', 'LINE_ID', :new.line_id);
ELSE
NULL;
END IF;
EXCEPTION
WHEN OTHERS
THEN
RAISE;
END tr_or_cl_sup_line;
Этот триггер уже существует в базе данных, но когда я пытаюсь обновить данные в таблице LINE с помощью запроса на обновление, выдает ошибку:
ORA-01403: no data found
ORA-06512: at "ZOR_1.TR_OR_CL_SUP_LINE", line 1
ORA-04088: error during execution of trigger 'ZOR_1.TR_OR_CL_SUP_LINE'
после удаления этого по-прежнему появляется та же ошибка
Исключая это, есть два других места, где может возникнуть эта ошибка. P_pause_triggers (n_Out); и P_OR_sup ('TR_OR_CL_SUP_line', 'LINE_ID',: NEW.line_id);
Удалите раздел ИСКЛЮЧЕНИЕ, он бесполезен (как сейчас выглядит). Тем не менее, это не исправит ваш НЕТ ДАННЫХ НАЙДЕН.
@Littlefoot, я тоже так делал, но не нашел решения
@ArtBajji Я удалил это из кода и получил эту ошибку: ORA-04098: триггер 'ZOR.TR_OR_CL_SUP_LINE' недействителен и не прошел повторную проверку
@ArtBajji Могу ли я отключить триггер? если я отключаю триггер, то обновление работает нормально, я хочу знать о последствиях
@ S.A. - если вы удалили обработчик исключений, вы должны увидеть более полезную информацию в сообщении об ошибке - в какой строке он действительно не работает. Если все, что вы изменили, останавливает его перекомпиляцию, посмотрите в user_errors
, чтобы понять, почему.
Как предложили Алекс и Литтлфут, после удаления раздела исключений, какую ошибку вы получаете? Вы можете вставить это сюда?
@AlexPoole, когда я удалил ошибку, она ни на что не повлияла, появляется та же ошибка ORA-01403: данные не найдены ORA-06512: в «ZOR_1.TR_OR_CL_SUP_LINE», строка 1 ORA-04088: ошибка при выполнении триггера ZOR_1. TR_OR_CL_SUP_LINE '
@AlexPoole, но если я отключу триггер, а затем обновлю, после этого включите триггер - этот сценарий работает нормально, но я не знаю, как он повлияет в будущем на базу данных
Он не сообщает вам номер строки перед сообщением ORA-01403? (Предположительно, триггер существует по какой-то причине и делает что-то важное; отключение не влияет на базу данных в точности, но может повлиять на целостность ваших данных, поэтому это не жизнеспособный обходной путь, если вы не получите деловое соглашение о том, что он больше не нужен.)
это говорит в строке 1
Что касается вашей ошибки: «ORA-04098: триггер 'ZOR.TR_OR_CL_SUP_LINE' недействителен и не прошел повторную проверку», есть ли ошибки компиляции? Пожалуйста, вставьте ошибку.
@ArtBajji Что касается ORA-04098, я получаю следующую причину и действие: Ошибка SQL: ORA-04098: триггер «ZOR.TR_OR_CL_SUP_LINE» недействителен и не прошел повторную проверку 04098. 00000 - «триггер«% s.% S »недействителен и не удалось выполнить повторную проверку "* Причина: была предпринята попытка получить триггер для выполнения, но он оказался недействительным. Это также означает, что для триггера не удалось выполнить компиляцию / авторизацию. * Действие: Возможны следующие варианты: устранение ошибок компиляции / авторизации, отключение триггера или сброс триггера.
следуя приведенным выше инструкциям, если я отключаю триггер и не могу удалить таблицу
Похоже, в триггере есть ошибки компиляции. Это не может быть выполнено. Перекомпилируйте триггер и используйте команду show errors, чтобы узнать, в чем заключается ошибка компиляции, и вставьте сюда ошибку компиляции. Надеюсь это поможет.
Приближается следующая ошибка: - Ошибка (1,437): PLS-00103: обнаружен символ «конец файла» при ожидании одного из следующих событий: (начало случая объявить конец исключения выхода для goto if loop mod null pragma raise return select update в то время как с <идентификатором> <идентификатор-разделителя в двойных кавычках> <переменная связывания> << продолжить закрыть текущее удаление выборка блокировка вставить открыть откат сохранить точку установить sql выполнить фиксацию для всех слияний очистка канала
ВЫБЕРИТЕ имя_пользователя INTO v_INuser FROM current_info WHERE session_id = USERENV ('SESSIONID'); Это может не приводить к строке.