2015-12-05 4 views
-1

У меня есть эта проблема, которая записывает текстовую строку каждый раз, когда выгружаете все копии фильма. Они хотят содержать дату, имя фильма и количество акций в текстовом файле. Я использовал курсор для получения данных из таблицы и 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; 
+0

Это домашнее задание? Запись в файл с триггера - это очень плохая идея. Предполагая, что это домашнее задание, используйте триггер уровня, не запрашивайте таблицу, просто используйте псевдо-запись ': new'. Как бы то ни было, вы перебираете каждый фильм в своем цикле, а 'c_qty' - любое значение, существующее в последней строке, считанной из таблицы. Нет причин ожидать, что это будет строка, которую вы обновляете. Если вам нужен триггер уровня инструкций, который написал строку для каждого фильма с количеством 0 каждый раз, когда любое изменение было внесено в любую строку, вы можете поместить логику в цикл. –

ответ

1
  1. Это выглядит как в высшей степени плохая идея.
  2. Можете ли вы успешно записать файл за пределы триггера? (Анонимная PL/SQL или хранимая процедура)
  3. FOPEN режим 'w' будет открыт для записи нового файла каждый раз, не так ли?
  4. У Oracle есть блокировки и что не для параллелизма. Все может не сработать, если запись в файл происходит из двух вызовов триггера одновременно.

Ваш код проходит через каждый ряд mm_movie в определенном порядке. Затем вы проверяете, является ли количество нулевым значением последней строки. (Эта последняя выборка является неопределенной.) Таким образом, могут быть строки с нулевым количеством, но до тех пор, пока строка нулевой величины не является последней, ваша логика обработки нуля не будет срабатывать.

Этот триггер пропускает все записи, а не только измененные записи. Если последняя строка имеет нулевое количество, она может быть установлена ​​на ноль месяца назад и уже выписана в файл много раз.

Я упоминал, что это выглядит как очень плохая идея?

Поднимите его на стол. Вставки в таблицы хорошо работают при одновременной нагрузке. Используйте для каждого курсора строки и NEW псевдо-запись.

Смежные вопросы