У меня есть эта проблема, которая записывает текстовую строку каждый раз, когда выгружаете все копии фильма. Они хотят содержать дату, имя фильма и количество акций в текстовом файле. Я использовал курсор для получения данных из таблицы и UTL_file.FILE_TYPE для записи вывода в текстовый файл. Однако триггер компилируется, но я не получаю никакого файла.PL/SQL Триггер для записи данных в txt-файл
create or replace trigger zeromovies_write
After update on mm_movie
DECLARE
c_id mm_movie.movie_id%type;
c_qty mm_movie.movie_qty%type;
CURSOR c_movie is
SELECT movie_id, movie_qty FROM mm_movie;
fh UTL_FILE.FILE_TYPE;
v_date DATE;
total VARCHAR2(50);
BEGIN
OPEN c_movie;
LOOP
FETCH c_movie into c_id, c_qty;
EXIT WHEN c_movie%notfound;
END LOOP;
if c_qty = 0 THEN
select sysdate into v_date from dual;
total := (c_id || c_qty || v_date);
fh := UTL_FILE.FOPEN('ORA_FILES', 'checkout.txt', 'w');
UTL_FILE.PUT_LINE(fh, total);
end if;
UTL_FILE.FCLOSE(fh);
close c_movie;
END;
Затем я обновляю таблицу, используя следующий код (установка числа до 0), но запись не происходит.
UPDATE mm_movie
SET movie_qty = 0
WHERE movie_id = 7;
UPDATE mm_movie
SET movie_qty = 0
WHERE movie_id = 8;
Это домашнее задание? Запись в файл с триггера - это очень плохая идея. Предполагая, что это домашнее задание, используйте триггер уровня, не запрашивайте таблицу, просто используйте псевдо-запись ': new'. Как бы то ни было, вы перебираете каждый фильм в своем цикле, а 'c_qty' - любое значение, существующее в последней строке, считанной из таблицы. Нет причин ожидать, что это будет строка, которую вы обновляете. Если вам нужен триггер уровня инструкций, который написал строку для каждого фильма с количеством 0 каждый раз, когда любое изменение было внесено в любую строку, вы можете поместить логику в цикл. –