我遇到这个问题,每次签出电影的所有副本时都会写入文本行。他们希望在文本文件中包含日期,电影ID和电影库存数量。我使用游标从表中获取数据,并使用UTL_file.FILE_TYPE将输出写入文本文件。触发器编译然而我没有写任何文件。
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;
然后我使用以下代码更新表(将qty设置为0)但写不会发生。
UPDATE mm_movie
SET movie_qty = 0
WHERE movie_id = 7;
UPDATE mm_movie
SET movie_qty = 0
WHERE movie_id = 8;
答案 0 :(得分:1)
FOPEN
模式'w'
每次都会打开一个新文件,不是吗?您的代码无特定顺序遍历mm_movie的每一行。然后测试最后一行的数量是否为零。 (最后一次获取是不确定的。)因此可能存在数量为零的行,但只要零数量行不是最后一行,您的零处理逻辑就不会被激活。
此触发器遍历所有记录,而不仅仅是已更改的记录。如果最后一行确实没有数量,那么它可能已经设置为零月之前已经多次写入文件。
我是否提到这看起来像是一个极其糟糕的主意?
将其记录到表格中。对表的插入在并发加载下运行良好。用于每个行光标和:NEW伪记录。